Web應用架構入門之11個基本要素

来源:https://www.cnblogs.com/fundebug/archive/2018/08/20/web_architecture_101.html
-Advertisement-
Play Games

讀完這篇博客,你就可以回答一個經典的面試題:當你訪問Google時,到底發生了什麼? ...


譯者: 讀完這篇博客,你就可以回答一個經典的面試題:當你訪問Google時,到底發生了什麼?

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用於學習。

當我還是小白的時候,如果知道Web應用架構就好了!

上圖展示了我們Storyblocks的架構,對於初學者來說,似乎有些複雜。

下麵我通過用戶訪問Strong Beautiful Fog And Sunbeams In The Forest頁面的處理過程來簡單說明各個架構要素的作用:

  • 當用戶點擊Strong Beautiful Fog And Sunbeams In The Forest訪問我們的圖片服務時,瀏覽器會先給DNS(功能變數名稱解析服務)伺服器發送請求,獲取IP地址,然後再給Storyblocks伺服器發送請求。
  • 用戶的請求會到達我們的Load Balancer(負載均衡服務),Load Balancer會隨機選擇我們10個Web Application Server(網頁應用服務)中的一個來處理這個請求。
  • Web Application Server會先在Caching Service(緩存服務)讀取圖片信息,然後再從Database(資料庫)中讀取其他數據。
  • 當Web Application Server發現圖片的color profile(顏色分析)還沒有計算時,會給Job Queue(任務隊列)發送一個color profile任務。
  • Job Server(任務服務)會從Job Queue中獲取corlor profile任務進行非同步計算,計算結束之後再更新資料庫。
  • Web Application Server會給search service(搜索服務)發送搜索請求,以圖片的名字作為關鍵詞,來查找類似的圖片。
  • 如果用戶恰好是登錄狀態,Web Application Server會去訪問Account Service(賬號伺服器)來獲取賬號信息。
  • Web Application Server會給data firehose(數據載入服務)發送一個Page View(網頁瀏覽)事件,並把它記錄到我們的Cloud Storage System(存儲雲),最終載入到我們的Data Warehouse(數據倉庫)中。數據分析師會通過Data Warehouse中的數據來分析我們的運行情況,輔助我們的商業決策。
  • Web Application Server會渲染出HTML,並把它通過Load Balancer發送給用戶的瀏覽器。頁面中的JavaScript和CSS文件存儲在我們的Cloud Storage System(存儲雲)中,並通過CDN進行分發。因此,用戶的瀏覽器會直接訪問CDN來獲取JavaScript和CSS文件。
  • 最後,瀏覽器再渲染整個頁面給用戶看。

我們的Strong Beautiful Fog And Sunbeams In The Forest頁面有一張非常漂亮的森林圖片,網頁截圖如下:

接下來,我會依次介紹每一個要素。

1. DNS

DNS全稱為Domain Name Server,即功能變數名稱解析服務,它是互聯網的基礎。提供功能變數名稱(比如google.com),DNS可以返回其IP地址(比如85.129.83.120)。有了IP地址,用戶的電腦才知道應該訪問哪個伺服器。這一點類似於手機號碼,功能變數名稱與IP的區別等價於"給馬雲打電話"和"給201-867–5309打電話"。以前你需要通過電話本查找馬雲的手機號碼,那DNS就類似於互聯網的電話本,你需要它來查詢某個功能變數名稱的IP。

2. Load Balancer

圖片來源

Load Balancer(負載均衡伺服器)是我們對應用進行橫向擴展的關鍵。它會把請求分發到多個Web Application Server(網頁應用服務)中的一個,這些Application Server運行的程式是一樣的,對同一個請求的處理方式完全相同,它們會把請求返回給客戶端。Load Balancer的作用就是分發請求,這樣,當某個伺服器宕機時,仍然可以保證服務。

目前,業界最受歡迎的Load Balancer是NginxFundebug用的也是Nginx

3. Web Application Servers

圖片來源

Web Application Server,即網頁應用服務,理解起來相對簡單一些。它們負責執行核心的業務邏輯,處理用戶的請求,並返回HTML給用戶瀏覽器。為了完成工作,它們通常需要訪問多種後端服務,比如資料庫、緩存、任務隊列、搜索服務等。在Load Balancer中提到過了,Web Application Server通常有多個副本,它們從Load Balancer獲取用戶請求。

Web Application Server需要使用特定的編程語言(Java, Node.js, Ruby, PHP, Scala, Java, C# .NET等) 和MVC框架(Node.js有Express, Ruby有Rails, Scala有Play, PHP有Laravel等)來實現。Fundebug後端語言用的是Node.js,框架用的是Express

4. Database

圖片來源

現代應用基本上都需要使用1個或者多個Dabase(資料庫)來存儲數據。利用資料庫,我們可以方便地對數據進行各種處理,比如定義數據結構、插入數據、查找數據、更新數據、刪除數據、對數據進行計算等。一般來說,Web Application Servers會直接訪問資料庫,Job Server也一樣。另外,每一種後端服務都有可能會需要獨立的資料庫。

目前,業界最受歡迎的開源資料庫技術有MySQLMongoDB等。Fundebug用的是MongoDB

5. Caching Service

圖片來源

Caching Service,即緩存服務,提供簡單的鍵值對存儲和讀取服務,它可以讓數據的存儲和讀取的時間複雜度接近於O(1)。對於複雜的計算,我們會將計算結果存儲到緩存中,這樣下次需要結果時,就不需要重新計算了,可以從緩存中直接讀取結果。Web Application Servers會將資料庫查詢、外部調用結果、某個URL對應的HTML文件等存儲到緩存中。

下麵是一些真實的緩存實例:

  • Google會緩存常見查詢的結果,比如"dog"或者"Taylor Swift",而不是每次去重新計算。
  • Facebook會緩存你登陸時看到的數據,比如動態、朋友等,細節可以閱讀Scaling Memcache at Facebook
  • 我們Storyblocks會緩存React服務端渲染的HTML,搜索結果等。

目前,業界最受歡迎的緩存技術是RedisMemcacheFundebug用的是Redis

如何你希望實時監控線上應用的BUG,歡迎免費試用Fundebug!

6. Job Queue & Servers

圖片來源

大多數網頁應用都需要在後臺進行一些非同步計算,這些計算並非直接與響應用戶請求有關。比如,Google需要爬取整個互聯網的網頁,併為其建立索引,這個計算不是在你搜索的時候進行,而是非同步進行,他們一直在更新網頁索引。

非同步計算有多種不同的方式,最普遍的方式就是Job Queue,即任務隊列。它由兩部分組成,一個保存任務的隊列,以及一個或者多個運行任務的服務。

Job Queue中保存了需要進行非同步計算的任務。最簡單的任務隊列是first-in-first-out (FIFO),即先進先出,而更為複雜的隊列會有優先順序機制。對於 Web Application Servers來說,當需要計算某個任務時,將這個任務加入隊列就可以了。

在Storyblocks,我們利用Job Queue運行非常多的後臺任務,比如編碼視頻和圖片、為CSV加標簽、統計用戶數據、發送密碼重置的郵件等。剛開始我們用的是FIFO隊列,後來我們增加了優先順序機制來保證響應時間要求高的任務(比如發送密碼重置郵件)可以儘快處理。

Job server(任務服務)負責運行任務,它們不斷從隊列中獲取任務然後執行。Job Server也可以使用各種後端語言編寫,Fundebug用的是Node.js

目前,業界流行的Job Queue技術有RabbitMQActiveMQKafka等,Fundebug用的是RabbitMQ

7. Full-text Search Service

大多Web應用都會支持搜索功能,用戶輸入關鍵詞,應用返回相關結果。搜索技術也被稱作full-text search,即全文檢索,是通過inverted index(倒排索引)來是的。如下圖所示:

事實上,資料庫比如MySQL會支持全文檢索功能,但是一般來說我們會採用獨立的Search Service(搜索服務)來計算和保存倒排索引,並提供搜索介面。目前最受歡迎的全文檢索技術是Elasticsearch,當然還有其他選擇,比如 SphinxApache SolrFundebug用的是Elasticsearch

8. Services

當應用規模足夠大時,很可能需要將一些服務拆分出來。這些服務並不向外部提供,而是提供給Web Application Servers以及其他內部服務。在Storyblocks,我們有很多這樣的服務:

  • Account service(賬號服務):管理我們所有站點的用戶賬號數據,提供統一的賬號系統。
  • Content service(內容服務):管理我們所有視頻、音頻和圖片的元數據,它會提供下載內容和查看歷史的介面。
  • Payment service(支付服務):提供介面來結算用戶的信用卡。
  • HTML → PDF service(HTML轉PDF服務):提供HTML轉PDF的介面。

Services也可以使用各種後端語言編寫,Fundebug用的是Node.js

9. Data

圖片來源

AI時代,一個公司的成敗取決於它如何利用數據。一個典型的數據處理處理流程有3個主要步驟:

  • Web Application Servers負責收集數據,通常是一些用戶行為記錄,將數據發送給Data Firhose(數據載入服務),Data Firhose負責將流數據可靠地載入到數據存儲和分析工具。AWS KinesisKafka可以作為Data Firhose。
  • Data Firhose將收集的原始數據以及初步處理過的數據存儲到數據云中。AWS Kinesis Data Firehose可以方便地將數據存儲到AWS 雲存儲(S3)中。
  • 初步處理過的數據可以載入到Data Warehouse(數據倉庫)進行處理。我們使用的是AWS Redshift,大型公司有些使用Oracle的Data Warehouse。如果數據非常大的話,可能需要使用Hadoop

還有,我們Storyblocks會每天晚上將Web Application Servers和各種Services的運行數據載入到Redshift中。這樣,我們的數據分析師可以結合所有數據進行綜合分析。

Fundebug使用Kafka作為Data Firhose,使用阿裡雲的對象存儲 OSS作為數據倉庫,使用Hadoop進行離線數據分析。

10. Cloud storage

Cloud storage即數據存儲雲,可以通過安全、可擴展的數據存儲服務,可以存儲任意數據,並可以通過HTTP介面進行操作和管理。亞馬遜的AWS 雲存儲(S3)是當前最受歡迎的數據存儲雲,我們Storyblocks依賴它來存儲視頻、音頻、圖片、JavaScript、CSS以及前文提到過的用戶行為數據等。

Fundebug使用阿裡雲的對象存儲 OSS以及騰訊雲的對象存儲 COS作為數據存儲雲。

11. CDN

CDN,全稱為Content Delivery Network,即內容分髮網絡,它可以利用更靠近用戶的伺服器分發HTML、CSS、JavaScript和圖片等靜態資源,有效降低頁面載入時間。不再使用單個源伺服器提供服務,而是利用全球各地的伺服器作為緩存伺服器分發靜態資源,用戶可以直接從更加靠近他們的緩存伺服器下載資源,而不需要去訪問源伺服器。

如下圖所示,當西班牙的用戶給紐約的網站請求某個頁面時,靜態資源可以從英國的緩存伺服器直接下載,而不再需要進行速度很慢的跨大西洋訪問:

圖片來源

這篇博客詳細介紹了CDN技術。一般來說,網頁應用會使用CDN來分發CSS,JavaScript,圖片以及視頻等靜態資源。Fundebug使用騰訊雲以及七牛雲的CDN服務。

參考

關於Fundebug

Fundebug專註於JavaScript、微信小程式、微信小游戲、支付寶小程式、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了6億+錯誤事件,得到了Google、360、金山軟體等眾多知名用戶的認可。歡迎免費試用!

版權聲明:
轉載時請註明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/08/20/11-element-of-web-application/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 得益於 JavaScript 加入的 decorator 特性,可以使我們跟 Java/C 一樣,更加直觀自然的,做面向切麵編程。而隨著 TypeScript 的成熟,類型系統也讓我們增強了信心,面對複雜的業務邏輯,也更有底氣。 "egg controller" 是集合了一些在 Controller ...
  • 序言 這裡要講的就是一個Redux在React中的應用問題,講一講Redux,react redux,redux thunk,redux actions,redux promise,redux sage這些包的作用和他們解決的問題。 因為不想把篇幅拉得太長,所以沒有太多源碼分析和語法講解,能怎麼簡單 ...
  • 前幾天安卓真機測試的時候,突然發現一個嚴重的問題。 後退兩次退出應用,再開啟白屏。而殺掉進程後再開啟就是好的。 這個重大bug我跟了好久,以為是splash-screen的問題。 後來一點一點打console,才找出問題————redux在後退兩次退出時,未重置,而保留了退出前的狀態值。 我不知道為 ...
  • 萬惡的IE,option竟然不支持display樣式,想到的解決思路有二個: 1、ajax聯動查詢 2、jQuery的remove()、after()方法 方法1的不好之處是初始頁面,需要顯示全部IP,本來已經從後臺查詢了一次,如果再利用ajax,會給伺服器造成壓力,所以採用方法2。 後臺code ...
  • 堆排序 堆排序是利用堆這種數據結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為O(nlogn),它也是不穩定排序。首先簡單瞭解下堆結構。 堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點 ...
  • 在通常的登錄界面我們都可以看到驗證碼,驗證碼的作用是檢測是不是人在操作,防止機器等非人操作,防止資料庫被輕而易舉的攻破。 驗證碼一般用PHP和java等後端語言編寫。 但是在前端,用canva或者SVG也可以繪製驗證碼。 繪製驗證碼不能是簡單的隨機字元串,而應該在繪製界面有一些干擾項: 如:干擾線段 ...
  • 項目地址:http://liu12fei08fei.github.io/blog/41react native.html 說明 • 項目總結代碼地址 • 從項目開始啟動(2018 07 02)到項目進入測試(2018 08 20) • 從我基本沒用過react,到直接上手react native • ...
  • js-完整輪播圖 今天寫一個完整的輪播圖,首先它需要實現三個功能:1.滑鼠放在小圓點上實現輪播。2.點擊焦點按鈕實現輪播。3.無縫自動輪播。 輪播圖的原理: 一系列的大小相等的圖片平鋪,利用CSS佈局只顯示一張圖片,其餘隱藏。通過計算偏移量(封裝一個動畫函數)自動播放,或通過手動點擊事件切換圖片。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...