架構圖解
摘要:web server 接下來需要獲取相關類似圖片信息,使用“圖片標題”請求全文搜索服務(圖中的【7】)。用戶點擊鏈接後,瀏覽器首先會去請求 DNS 服務器(圖中的【1】),獲得網站的 IP 地址,然後通過 IP 請求網站。
這是一個很典型的架構描述圖,下面我們就以此爲例聊聊架構的基礎概念。
架構流程示例
假設用戶在搜索引擎中搜索“ 森林裏濃霧和陽光 ”。
用戶點擊了搜索結果中的一個圖片網站鏈接,打開一張圖片的詳情頁。
這個頁面的主要內容包括:
-
主圖
-
圖片信息,如標題、作者、描述、標籤、評論 ……
-
相關類似圖片
-
用戶信息
從用戶點擊了搜索結果中的那條連接,一直到呈現出最終的頁面,中間經歷了什麼?
(爲了便於對照,再放一張)
用戶點擊鏈接後,瀏覽器首先會去請求 DNS 服務器(圖中的【1】),獲得網站的 IP 地址,然後通過 IP 請求網站。
請求首先會到達網站的負載均衡器(圖中的【2】)。
負載均衡器從多個 web server 中選擇一個,把請求轉過去,讓他處理。(圖中的【3】)。
web server 從 cache 中獲取圖片的常用信息,從數據庫中獲取圖片的其他信息。(圖中的 【4】【5】)。
如果發現圖片還沒有被處理過,例如顏色還沒調整,就向隊列中發一個任務(圖中的【6a】),任務處理服務器從隊列中接收任務並處理(圖中的【6b】)。
(爲了便於對照,再放一張)
web server 接下來需要獲取相關類似圖片信息,使用“圖片標題”請求全文搜索服務(圖中的【7】)。
如果發現此用戶是已經登錄的用戶,請求 account service 獲取用戶的詳細信息(圖中的【8】)。
web server 現在已經拿到頁面展示所需的全部信息。
最後,發送一個頁面訪問事件,放入流數據處理系統,事件會進入到雲存儲系統和數據倉庫,用於做商業分析(圖中的【9a】【9b】【9c】【10】)。
web server 開始組織 HTML 頁面,然後通過負載均衡器返回給瀏覽器。
頁面中包含 JS 和 CSS 資源,這些資源會被放入雲存儲系統,這個系統與CDN連接,所以 JS 和 CSS 就會載入 CDN。
這樣,瀏覽器加載頁面中的 JS 和 CSS 時就可以直接從 CDN 中讀取(圖中的【11】)。
最終,瀏覽器把頁面渲染出來,呈現給用戶。
核心部件
1. DNS
全稱“Domain Name System”,提供根據域名找 IP 的服務。
例如:google.com -> 85.129.83.120。
2. Load Balancer 負載均衡器
用戶的請求先發到負載均衡器(LB)上,LB 再從後面衆多的 web 服務器中選一個,把請求交給他處理。
後面的那些web服務器都是一樣的,處理邏輯一致。
web 服務器處理完後,把結果交給 LB,LB 再返回給用戶。
3. web 服務器
接收請求,執行業務邏輯,返回響應信息。
會調用後端一系列的服務,如數據庫、緩存、隊列、搜索、其他服務、日誌 ……
4. 數據庫
數據庫可以是 SQL,也可能是 NoSQL,或者混合使用。
5. 緩存
用來進行簡單的 key/value 存儲,速度快。
例如搜索引擎可以把常用的搜索結果保存在緩存中;內容型網站會把文章放到緩存 ……
6.任務隊列、任務處理服務器
用於做異步處理。
隊列接收任務,任務處理服務器(worker,可以有多個)從隊列中拿出任務進行處理。
隊列是一個需要異步執行的任務列表,常用的是先進先出模式,嚴格按照入隊順序出隊,還有優先級模式,入隊時給任務添加一個優先級,出隊按照優先級出隊,相當於給任務賦予了特權。
隊列應用的場景非常多,例如:
-
用戶上傳圖片、視頻,後臺進行異步處理、轉碼
-
用戶數據統計聚合
-
用戶註冊發送郵件、短信
7. 全文搜索
有一個重要的概念:倒排索引。
例如上圖,對標題進行分詞,然後以每個詞作爲關鍵字,指出誰的標題中含有這個關鍵字,這就是倒排索引。
主流的全文搜索服務有 Elasticsearch、Sphinx、Apache Solr。
8. Service
不直接暴露給外部,內部調用,例如:
-
用戶服務
-
內容服務
-
支付服務
-
HTML 轉 PDF 服務
9. Data
如今,數據可以說是企業的命脈,大家都會盡可能的收集數據、分析數據,以便進行有效的商業決策。
典型的數據管道包括:
-
應用發送數據,例如用戶交互行爲,發送到流數據系統中,如 kafka。
-
保存原始數據,就是從應用端發送來的數據,未經處理的,保存起來,例如保存到雲存儲系統中。
-
放入數據倉庫進行分析,根據自己的分析模型對數據進行處理。
10. Cloud storage 雲存儲
雲存儲太方便了,使用簡單、擴展性好、性能強。
本地的文件都可以放到雲存儲上,例如圖片、音頻、視頻、JS、CSS ……
11. CDN
CDN 是內容分發網絡,可以簡單理解爲資源緩存,圖片、音頻、視頻、JS、CSS 都可以加載到 CDN。
沒有CDN時,需要直接請求從服務器,如果用戶距離服務器很遠,那就非常慢了。
有了CDN以後,用戶可以從距離自己最近的 CDN 節點中拿到資源,速度快,還減輕了服務器的壓力。