Web架構基礎101

大型動態應用系統平臺主要是針對於大流量、高併發網站建立的底層系統架構。大型網站的運行需要一個可靠、安全、可擴展、易維護的應用系統平臺做爲支撐,以保證網站應用的平穩運行。

下圖是現代Web應用架構的一個很好的概覽。如果不是經驗豐富的Web開發人員,可能會覺得它很複雜。通過以下的介紹可以對每個組件的細節有一個初步的認識和了解。

圖1 web應用架構概覽

1. DNS

DNS代表“域名服務器”,它是使萬維網成爲可能的骨幹技術。DNS提供從域名(例如,google.com)到IP地址(例如,85.129.83.120)的鍵/值查找,這是計算機將請求路由到適當的所必需的。類似於電話號碼,域名和IP地址之間的差異是“致電John Doe”和“致電201-867-5309”之間的區別。就像需要一本電話簿來查找過去John的號碼,需要DNS來查找域的IP地址。因此,可以將DNS視爲互聯網的電話簿。

2. 負載均衡

在深入研究負載平衡的細節之前,需要退一步討論水平與垂直應用程序擴展。水平擴展意味着可以通過在資源池中添加更多計算機來擴展,而“垂直”擴展意味着可以通過向現有計算機添加更多功率(例如,CPU,RAM)來擴展。

在Web開發中,總是希望水平擴展,爲了簡單起見,也是因爲內容可能會中斷。服務運行的過程中會出現服務器隨機崩潰、網絡降級、整個數據中心脫機等問題。擁有多個服務器允許規劃中斷,以便應用程序繼續運行。換句話說,應用程序是“容錯的”。其次,橫向擴展允許通過讓每個部分在不同的服務器上運行來最小化地耦合應用程序後端的不同部分(Web服務器,數據庫,服務X等)。

回到負載平衡器,它們使水平縮放成爲可能。它們將傳入的請求路由到許多應用程序服務器中的一個,這些服務器通常是彼此的克隆/鏡像映像,並將響應從應用程序服務器發送回客戶端。它們中的任何一個都應該以相同的方式處理請求,因此只需要在服務器集中分發請求,這樣就不會使這些請求過載。

3. Web應用服務器

Web應用程序服務器的描述相對簡單。它們執行處理用戶請求的核心業務邏輯,並將HTML發送回用戶的瀏覽器。爲了完成其工作,它們通常與各種後端基礎設施進行通信,例如數據庫,緩存層,作業隊列,搜索服務,其他微服務,數據/日誌記錄隊列等。 如上所述,爲了處理用戶請求,通常需要多個應用服務器,並且需要插入負載均衡服務。

應用服務器的實現需要選擇特定語言(Node.js,Ruby,PHP,Scala,Java,C#.NET等)和該語言的Web MVC框架(Express for Node.js,Ruby on Rails ,Play for Scala,Laravel for PHP等)。深入研究這些語言和框架的細節超出了本文的範圍。

4. 數據庫服務器

每個現代Web應用程序都利用一個或多個數據庫來存儲信息。數據庫提供了定義數據結構,插入新數據,查找現有數據,更新或刪除現有數據,跨數據執行計算等的方法。在大多數情況下,Web應用程序服務器與作業服務器直接對話。此外,每個後端服務可能擁有自己的數據庫,該數據庫與應用程序的其餘部分隔離。

NoSQL代表“Non-SQL”,它是一種新的數據庫技術集,它可以處理大規模Web應用程序可以生成的大量數據(SQL的大多數變體都不能很好地水平擴展,只能垂直縮放到某一點)。大體上,業界正在將SQL作爲一個接口,即使對於NoSQL數據庫也是如此。學習SQL是必不可少的,幾乎所有的Web應用都會使用它。

5. 緩存服務

緩存服務提供了一個簡單的鍵/值數據存儲,可以在接近O(1)的時間內保存和查找信息。 應用程序通常利用緩存服務來保存昂貴計算的結果,以便可以從緩存中檢索結果,而不是在下次需要時重新計算它們。應用程序可能會緩存數據庫查詢,對外部服務的調用,給定URL的HTML等等的結果。 以下是來自實際應用的一些示例:

  • Google會爲常見搜索查詢(如“dog”或“Taylor Swift”)緩存搜索結果,而不是每次都重新計算它們
  • Facebook會緩存您在登錄時看到的大部分數據,例如發佈數據,朋友等。在此處閱讀有關Facebook緩存技術的詳細文章。

目前兩種最普遍的緩存服務器技術是Redis和Memcache。

6. 任務隊列&服務器

大多數Web應用程序需要在幕後異步執行一些與響應用戶請求無直接關聯的工作。例如,Google需要抓取並索引整個互聯網才能返回搜索結果。但是它不是每次搜索時都會這樣做。相反,它異步爬取信息,在整個過程中更新搜索索引。

雖然有不同的體系結構可以完成異步工作,但最普遍的就是我稱之爲“作業隊列”的體系結構。它由兩部分組成:需要運行的“作業”隊列和運行隊列中作業的一個或多個作業服務器(通常稱爲“工作者”)。

作業隊列存儲需要異步運行的作業列表。最簡單的是先進先出(FIFO)隊列,但大多數應用程序最終需要某種優先級排隊系統。每當應用程序需要運行作業時,無論是在某種常規計劃中還是由用戶操作確定,它只需將相應的作業添加到隊列中。

例如,相關公司可以利用一個工作隊列提供後臺支持。運行工作來編碼視頻和照片,處理CSV以進行元數據標記,聚合用戶統計信息,發送密碼重置電子郵件等。工作隊列可以採用優先級隊列算法,以確保儘快完成發送密碼重置電子郵件等時間敏感操作。

作業服務器處理作業。它們輪詢作業隊列以確定是否有工作要做,如果有,它們會從隊列中彈出作業並執行它。

7. 全文搜索服務

許多Web應用程序支持某種搜索功能,其中用戶提供文本輸入(通常稱爲“查詢”),並且應用程序返回最相關的結果。支持此功能的技術通常稱爲“全文搜索”,它利用反向索引快速查找包含查詢關鍵字的文檔。

圖2 反向索引示例

雖然可以直接從某些數據庫進行全文搜索(例如,MySQL支持全文搜索),但通常運行單獨的“搜索服務”來計算和存儲反向索引並提供查詢接口。今天最流行的全文搜索平臺是Elasticsearch,儘管還有其他選項,如Sphinx或Apache Solr。

8. 通用服務

一旦應用程序達到一定規模,可能會有某些“服務”被分割出來作爲單獨的應用程序運行。它們沒有暴露於外部世界,但應用程序和其他服務與它們互動:

  • 帳戶服務:在網站上存儲用戶數據,這使得商家能夠輕鬆提供交叉銷售機會並創建更統一的用戶體驗
  • 內容服務存儲所有視頻,音頻和圖像內容的元數據。它還提供用於下載內容和查看下載歷史記錄的界面。
  • 支付服務提供用於對客戶信用卡進行計費的界面。
  • HTML→PDF服務提供了一個接受HTML並返回相應PDF文檔的簡單界面。

9. 數據

如今,公司存亡取決於他們利用數據的能力。幾乎每個應用程序,一旦達到一定規模,就會利用數據管道來確保收集,存儲和分析數據。典型的管道有三個主要階段:

  1. 該應用程序將數據(通常是關於用戶交互的事件)發送到數據“firehose”,該數據提供用於攝取和處理數據的流接口。通常,原始數據被轉換或擴充並傳遞給另一個firehose。 AWS Kinesis和Kafka是用於此目的的兩種最常用的技術。
  2. 原始數據以及最終轉換/增強數據保存到雲存儲。AWS Kinesis提供了一個名爲“firehose”的設置,可以將原始數據保存到雲存儲(S3)中,非常容易配置。
  3. 經過轉換/增強的數據通常被加載到數據倉庫中進行分析。大型公司通常會使用Oracle或其他專有存儲技術。如果數據集足夠大,則可能需要類似Hadoop的NoSQL MapReduce技術進行分析。

架構圖中沒有描繪的另一個步驟:將數據從應用程序和服務的操作數據庫加載到專門存儲數據的數據庫中。通過將核心業務數據與用戶交互事件數據結合起來,爲分析師提供一個整體數據集。

10. 雲存儲

據AWS稱,“雲存儲是一種通過互聯網存儲,訪問和共享數據的簡單且可擴展的方式”。 您可以使用它來存儲和訪問或多或少存儲在本地文件系統上的任何內容,並且可以通過HTTP上的RESTful API與其進行交互。亞馬遜的S3產品是目前最流行的雲端存儲產品,也是許多多媒體行業公司廣泛依賴的產品,用於存儲視頻,照片和音頻資產,CSS和Javascript,用戶事件數據等等。

11. CDN

CDN代表“內容分發網絡”,該技術提供了一種通過網絡提供靜態HTML,CSS,Javascript和圖片等內容的方式,比從單一源服務器提供服務要快得多。它的工作原理是在世界各地的許多“邊緣”服務器上分發內容,以便用戶最終從“邊緣”服務器而不是源服務器下載內容。例如,在下圖中,西班牙的用戶從位於紐約市的原始服務器的站點請求網頁,但該頁面的靜態資產是從英格蘭的CDN“邊緣”服務器加載的,從而防止了許多緩慢的跨大西洋HTTP 要求。

圖3 CDN示例

通常,Web應用程序應始終使用CDN來提供CSS,Javascript,圖像,視頻和其他媒體內容。某些app也可能利用CDN來提供靜態HTML頁面。

參考資料

[1]https://engineering.videoblocks.com/web-architecture-101-a3224e126947

[2]https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章