架構(gòu)設(shè)計(jì)中的后臺(tái)任務(wù):三種場景,2.5 種觸發(fā)模式,三個(gè)重點(diǎn)考量?
什么場景下會(huì)使用后臺(tái)任務(wù)?
常見的三類場景:
其一,密集任務(wù)處理。
舉例:用戶上傳頭像場景,上傳完原圖之后,需要生成大圖,中圖,小圖。這個(gè)過程非常占用磁盤IO,且比較耗時(shí),不應(yīng)該讓用戶在上傳頁面等待,故可以啟動(dòng)一個(gè)后臺(tái)任務(wù)來執(zhí)行。
其二,定期任務(wù)處理。
舉例:每天要清理日志,每周要備份數(shù)據(jù)庫,每月要統(tǒng)計(jì)銷售提成,每年要導(dǎo)出IT審計(jì)數(shù)據(jù)。這類每天,每周,每月,每年都定期執(zhí)行的任務(wù),可以啟動(dòng)一個(gè)后臺(tái)任務(wù)來執(zhí)行。
其三,批量任務(wù)處理。
舉例:要對(duì)所有數(shù)據(jù)進(jìn)行一次性加密處理,要對(duì)大語言模型進(jìn)行參數(shù)訓(xùn)練,這類任務(wù)雖然不是定期執(zhí)行,但也一般不啟動(dòng)服務(wù),而是使用后臺(tái)任務(wù)。
后臺(tái)任務(wù)有幾種常見的觸發(fā)模式?
常見的有2.5種:
- 第1種,時(shí)間表觸發(fā)(Schedule-driven triggers)。例如:crontable,基于計(jì)時(shí)器周期,定期觸發(fā)。
- 第2種,事件觸發(fā)(Event-driven triggers)。如前文的例子,用戶上傳原圖時(shí),觸發(fā)大圖,中圖,小圖的生成。
畫外音:這里也可以啟動(dòng)一個(gè)以分鐘為單位的crontable定期觸發(fā)來實(shí)現(xiàn),但效率較低。
- 第2.5種,人工觸發(fā)(Manual-driven triggers)。老板找你導(dǎo)數(shù)據(jù),你才執(zhí)行任務(wù),這也算事件觸發(fā)的一種特例。只不過發(fā)過來的消息不是MQ,而是老板命令。
架構(gòu)設(shè)計(jì)過程中,后臺(tái)任務(wù)的設(shè)計(jì)重點(diǎn)是什么?
后臺(tái)任務(wù)方案設(shè)計(jì)上有三個(gè)重點(diǎn):
(1) 其一,高可用。除了要考慮冗余+故障轉(zhuǎn)移之外,還要重點(diǎn)考慮任務(wù)的執(zhí)行狀態(tài)與任務(wù)元數(shù)據(jù)的保存,同時(shí)要有任務(wù)探測(cè)與任務(wù)重試機(jī)制,以保證任務(wù)的高可用。這一部分,主要由分布式調(diào)度平臺(tái)來實(shí)現(xiàn)。
(2) 其二,冪等性。后臺(tái)任務(wù)中斷時(shí),會(huì)不會(huì)污染數(shù)據(jù);后臺(tái)任務(wù)重試時(shí),如何保證重試任務(wù)的冪等性。這一部分,主要是由業(yè)務(wù)任務(wù)代碼來保證。
(3) 其三,數(shù)據(jù)傳遞。工程系統(tǒng)與后臺(tái)任務(wù)之間的數(shù)據(jù)如何傳遞,最佳實(shí)踐是:只傳遞消息元數(shù)據(jù),不傳遞批量數(shù)據(jù)本身。
- 例子1:工程系統(tǒng)用戶上傳了原圖,只給后臺(tái)任務(wù)傳遞用戶uid和消息類型,不要把原圖當(dāng)做參數(shù)。
- 例子2:生成報(bào)表的多個(gè)任務(wù)之間,只傳遞任務(wù)開始,任務(wù)結(jié)束等消息,不要把數(shù)據(jù)批量傳輸。
知其然,知其所以然。
思路比結(jié)論更重要。