一個(gè) Web 應(yīng)用通過(guò)功能分割沈矿,可以分為不同組件上真。本文以一個(gè) Rails 應(yīng)用為例,列出各個(gè)常用組件羹膳。
1. 負(fù)載均衡:Nginx
使用 Nginx 作為負(fù)載均衡服務(wù)睡互,Nginx 將請(qǐng)求平衡、分?jǐn)偨o多個(gè) Web 服務(wù)陵像。
2. Web 應(yīng)用服務(wù):Puma
Web 應(yīng)用服務(wù)根據(jù)客戶端的請(qǐng)求執(zhí)行業(yè)務(wù)流程就珠,然后返回格式為 HTML 或 JSON 之類的響應(yīng)。這個(gè)過(guò)程會(huì)跟很多服務(wù)通信:從數(shù)據(jù)庫(kù)取記錄醒颖、將耗時(shí)操作發(fā)給異步任務(wù)服務(wù)等等妻怎。
3. 數(shù)據(jù)庫(kù):PostgreSQL
用數(shù)據(jù)庫(kù)來(lái)定義數(shù)據(jù)結(jié)構(gòu),根據(jù)業(yè)務(wù)規(guī)則對(duì)數(shù)據(jù)增刪改查泞歉。比如一個(gè)商城應(yīng)用逼侦,它需要?jiǎng)?chuàng)建商品、創(chuàng)建購(gòu)物車條目腰耙、修改訂單狀態(tài)等等偿洁。
4. 緩存服務(wù):Redis
Redis 是一個(gè) in-memory 數(shù)據(jù)庫(kù),提供了一種簡(jiǎn)單的鍵值對(duì)沟优,使得存取數(shù)據(jù)的時(shí)間復(fù)雜度為 O(1)。通過(guò)緩存服務(wù)睬辐,我們可以存儲(chǔ)運(yùn)算成本比較高的結(jié)果挠阁,然后以后快速取得這些內(nèi)容宾肺。
比如在權(quán)限系統(tǒng)中,在用戶訪問(wèn)資源前侵俗,需要檢查用戶的權(quán)限锨用。而用戶的權(quán)限列表需要從訪問(wèn)好幾個(gè)數(shù)據(jù)庫(kù)表才能構(gòu)建出來(lái)。
- 我們?cè)诘谝淮螜z查權(quán)限時(shí)把構(gòu)建好的權(quán)限列表存到緩存中隘谣。
- 下次檢查權(quán)限時(shí)增拥,就不必從數(shù)據(jù)庫(kù)加載記錄了,可以直接從緩存中讀取寻歧。
要注意的是掌栅,每次寫(xiě)緩存時(shí),都要考慮在什么條件下進(jìn)行失效處理码泛。對(duì)于權(quán)限列表猾封,我們應(yīng)該在用戶權(quán)限更改時(shí),將它刪除噪珊。
5. 任務(wù)隊(duì)列:Sidekiq
Sidekiq 是一個(gè)基于 Redis 的異步任務(wù)服務(wù)晌缘。當(dāng)我們創(chuàng)建一個(gè)任務(wù)時(shí),Sidekiq 將任務(wù)存進(jìn) Redis痢站,Sidekiq 服務(wù)根據(jù)調(diào)度規(guī)則不斷從 Redis 獲取任務(wù)磷箕,然后處理。對(duì)于一些我們不關(guān)心其返回結(jié)果或者比較耗時(shí)的操作阵难,我們可以異步處理這些操作岳枷。
比如用戶注冊(cè)成功后,系統(tǒng)會(huì)發(fā)一封歡迎郵件給該用戶多望,發(fā)送郵件這個(gè)操作不必在注冊(cè)接口中執(zhí)行嫩舟,就可以不阻塞用戶的注冊(cè)動(dòng)作。
6. 消息隊(duì)列:Active Mq
消息隊(duì)列有許多好處:平衡流量高峰怀偷、解耦家厌。消息列隊(duì)有 2 個(gè)角色:發(fā)布者、消費(fèi)者椎工。他們不關(guān)心消息從哪里來(lái)饭于,到哪里去,只關(guān)心消息內(nèi)容维蒙,從而達(dá)到解耦的目的掰吕。
比如在一個(gè)酒店管理系統(tǒng)下, A 系統(tǒng)修改房間狀態(tài)后發(fā)布了一條消息出去颅痊,B 系統(tǒng)收到這條消息殖熟,它再根據(jù)內(nèi)容做其他事情,這個(gè)過(guò)程中斑响,A 不用擔(dān)心有哪些系統(tǒng)要監(jiān)聽(tīng)這個(gè)消息菱属,也不必關(guān)心消息是否被成功處理钳榨。
作為消費(fèi)者,需要啟動(dòng)一個(gè)進(jìn)程來(lái)專門接收消息纽门,Ruby 應(yīng)用可以使用 Stomp 作為 ActiveMq 的消費(fèi)者薛耻。
7. 搜索引擎:ElasticSearch
使用搜索引擎,我們可以快速給應(yīng)用添加這些功能:實(shí)時(shí)查詢赏陵、聚合數(shù)據(jù)饼齿、全文搜索。
8. CDN
存儲(chǔ)靜態(tài)資源文件蝙搔,比如圖片缕溉、Javascript、HTML杂瘸、CSS 等等倒淫。
- CDN 服務(wù)會(huì)將文件存儲(chǔ)在世界各地的服務(wù)器上,可以讓各個(gè)地方的用戶快速訪問(wèn)資源败玉。
- 而且這些流量不用經(jīng)過(guò)我們的 Web 服務(wù)器敌土,為應(yīng)用服務(wù)器分擔(dān)負(fù)載。
參考文章: