服務(wù)架構(gòu):Web-Queue-Worker架構(gòu)
- 這種架構(gòu)的核心組件包含:
- 一個(gè)Web前端,用戶可以通過(guò)這里發(fā)送請(qǐng)求
- 一個(gè)worker服務(wù),它可以執(zhí)行資源密集型任務(wù)、耗時(shí)的工作流或批處理作業(yè)。
Web前端和worker服務(wù)通過(guò)一個(gè)消息隊(duì)列進(jìn)行通信。
這個(gè)架構(gòu)中還包含其它一些組件:
- 一個(gè)/多個(gè)數(shù)據(jù)庫(kù)
- KV Cache,用來(lái)降低數(shù)據(jù)庫(kù)的負(fù)載
- CDN系統(tǒng),提供靜態(tài)資源的訪問(wèn)加速
- 遠(yuǎn)程服務(wù),比如email或消息發(fā)送服務(wù),通常是第三方的服務(wù)
- 身份認(rèn)證服務(wù),比如Google Oauth登錄服務(wù)
Web前端和worker服務(wù)都是無(wú)狀態(tài)的。作業(yè)的會(huì)話狀態(tài)通常存儲(chǔ)在分布式存儲(chǔ)里(比如Redis集群)。worker通過(guò)異步的方式處理耗時(shí)的作業(yè),我們通常使用消息隊(duì)列來(lái)觸發(fā)作業(yè)的創(chuàng)建和執(zhí)行,或者通過(guò)一個(gè)定時(shí)任務(wù)調(diào)度批處理任務(wù)。worker并不是必須的,如果沒(méi)有耗時(shí)的操作,就不需要它。
前端除了頁(yè)面的部分,也可以提供web API(BFF層)。在client端,我們可以通過(guò)一個(gè)單頁(yè)應(yīng)用觸發(fā)ajax請(qǐng)求,或者使用原生的APP去觸發(fā)。
應(yīng)用場(chǎng)景
Web-Queue-worker架構(gòu)在云服務(wù)中很常見(jiàn),比如函數(shù)計(jì)算服務(wù)(FAAS)。這類服務(wù)通常會(huì)提供 HTTP API 或 RPC API,同時(shí)支持消費(fèi)Kafka來(lái)的流式消息。目前流行的低代碼也是由此衍生出來(lái)的。
該架構(gòu)適用于以下的場(chǎng)景:
- 應(yīng)用的業(yè)務(wù)領(lǐng)域/場(chǎng)景比較簡(jiǎn)單
- 應(yīng)用包含了一些耗時(shí)的工作流或批處理任務(wù);
- 想要低成本地接入現(xiàn)有的服務(wù),而不是從Infra開(kāi)始搭建
架構(gòu)優(yōu)勢(shì)
- 架構(gòu)簡(jiǎn)單易懂;
- 部署和管理很簡(jiǎn)單;
- 服務(wù)職能邊界清晰;
- 前端和worker是解耦的,消息隊(duì)列使用現(xiàn)成的技術(shù)即可;
- 前端和worker可以獨(dú)立進(jìn)行擴(kuò)容;
有哪些挑戰(zhàn)
- 如果設(shè)計(jì)不合理,前端和worker都可能融入太多的邏輯,變得越來(lái)越重。后期演變成單體架構(gòu)后,很難維護(hù)和升級(jí);
- 如果前端和worker共享了一些數(shù)據(jù)結(jié)構(gòu)或代碼,可能會(huì)有隱藏的依賴;
最佳實(shí)踐
- 暴露給client的API必須清晰明了,經(jīng)過(guò)良好的設(shè)計(jì);對(duì)于HTTP請(qǐng)求,可以遵循REST協(xié)議;
- 對(duì)于工作負(fù)載的變化,啟動(dòng)自動(dòng)擴(kuò)縮容;云平臺(tái)和K8s都提供了監(jiān)控實(shí)例CPU/內(nèi)存自動(dòng)擴(kuò)縮容的能力;
- 對(duì)于半靜態(tài)的數(shù)據(jù),使用緩存進(jìn)行加速訪問(wèn);比如memcached/memory cache等;
- 使用CDN對(duì)靜態(tài)資源進(jìn)行緩存加速;
- 根據(jù)需求使用混合持久化方案。比如關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)混合使用,比如KV存儲(chǔ)、文檔數(shù)據(jù)庫(kù)、搜索數(shù)據(jù)庫(kù)、時(shí)序數(shù)據(jù)庫(kù)、列式存儲(chǔ)數(shù)據(jù)庫(kù)、圖數(shù)據(jù)庫(kù)等。數(shù)據(jù)庫(kù)之間,可以采用最終一致性方案進(jìn)行數(shù)據(jù)同步;
- 對(duì)數(shù)據(jù)進(jìn)行分區(qū),分區(qū)可以更好地支持?jǐn)U容,減少競(jìng)爭(zhēng)讀寫問(wèn)題,提升訪問(wèn)性能。