一些關(guān)鍵點(diǎn)的設(shè)計(jì)腦暴記錄----very important?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-615710.html
- 首先,任務(wù)存儲(chǔ)交給kafka,由節(jié)點(diǎn)負(fù)責(zé)寫入kafka,acks=1;失敗重試;透傳kafka的提交可靠性,保證任務(wù)提交成功;后續(xù)可以考慮自己實(shí)現(xiàn)kafka相關(guān)機(jī)制---做局部優(yōu)化,因?yàn)閺?qiáng)依賴kafka
- 如何保證消息唯一被消費(fèi)一次---集群狀態(tài)維護(hù)全局消息唯一key,在寫入kafka之前生成,保證提交的任務(wù)具有全局唯一key;每次消息執(zhí)行成功做集群廣播,通知到一半以上的節(jié)點(diǎn)再持久化(這里考慮一半以上節(jié)點(diǎn)還是所有節(jié)點(diǎn),應(yīng)該是所有節(jié)點(diǎn)才行--研究一下一半以上的架構(gòu)模型適用于什么場景);每個(gè)節(jié)點(diǎn)間隔時(shí)間做持久化,因?yàn)槭羌喜僮鞅WC不會(huì)重復(fù);間隔時(shí)間做持久化保證性能;(這里存在疑點(diǎn),如果多節(jié)點(diǎn)同時(shí)失敗怎么辦,參考zookeeper的持久化機(jī)制,或者集群同步機(jī)制)保證全局key持久化成功,這樣不能保證任務(wù)消息只被提交一次---數(shù)據(jù)庫操作才可以保證,需要依賴回滾機(jī)制;;;有些任務(wù)不具有回滾性質(zhì)--比如發(fā)送郵件。如何處理?可以分為兩段提交,prepare狀態(tài)在發(fā)郵件之前執(zhí)行,提供檢查策略用于其他節(jié)點(diǎn)檢查郵件是否真實(shí)被執(zhí)行;數(shù)據(jù)庫操作提供自檢查--檢查全局ID即可;文件和郵件短信之類的操作需要用戶提供檢查策略;---理論上嚴(yán)格保證唯一執(zhí)行需要每次處理任務(wù)前執(zhí)行檢查策略--所以這里要可配置,是否需要嚴(yán)格只執(zhí)行一次,還是至少被執(zhí)行一次--原理和提交可靠性一樣---也不太一樣,提交策略是至少被提交一次,其實(shí)有可能多次提交;
- 如何維護(hù)集群狀態(tài)全局唯一key,預(yù)分配+全局投票;
- 再談如何保證消息唯一被消費(fèi)一次--全內(nèi)存操作,只有消息消費(fèi)成功才給kafka提交offset,因?yàn)槭侨珒?nèi)存操作保證每次拉取的消息數(shù)量不會(huì)太多;---怎么保證消息不回積壓--積壓問題通過集群部署實(shí)現(xiàn),因?yàn)槿珒?nèi)存操作保證最大運(yùn)行能力,還產(chǎn)生積壓說明系統(tǒng)配置不夠;--非必要不考慮將消息再次持久化,如果要持久化只考慮持久化極少數(shù)一部分;
- 集群狀態(tài)通過全局廣播或者zookeeper來實(shí)現(xiàn)--基本上考慮節(jié)點(diǎn)上線和節(jié)點(diǎn)下線問題;也要考慮節(jié)點(diǎn)網(wǎng)絡(luò)延遲問題;--一般來說全局廣播和zookeeper的原理是一樣的;
- 定制化分布式線城池--任務(wù)分類;優(yōu)先級(jí);線程池動(dòng)態(tài)監(jiān)控和動(dòng)態(tài)調(diào)整;---詳細(xì)考慮設(shè)計(jì)哪些參數(shù),比如任務(wù)執(zhí)行時(shí)間,單任務(wù)實(shí)際線程運(yùn)行時(shí)間和阻塞時(shí)間,IO操作時(shí)間--然后對(duì)任務(wù)打標(biāo)簽---標(biāo)簽是否需要廣播,廣播后在任務(wù)提交時(shí)就打標(biāo)簽,以配合自我流量控制;
- 任務(wù)處理器handler如何注冊(cè)--動(dòng)態(tài)加載;JNI;或者RPC--這三種方式應(yīng)該都要支持;
- 單節(jié)點(diǎn)流量控制--根據(jù)當(dāng)前節(jié)點(diǎn)實(shí)際任務(wù)執(zhí)行情況做流量控制,單節(jié)點(diǎn)消費(fèi)能力做流量調(diào)節(jié)跟其他節(jié)點(diǎn)沒有關(guān)系--因?yàn)槭亲畲竽芰?zhí)行;
- 延時(shí)隊(duì)列怎么實(shí)現(xiàn)--雙隊(duì)列--實(shí)時(shí)隊(duì)列和延時(shí)隊(duì)列--但是這里也要配合標(biāo)簽和流量控制考慮到實(shí)際上的延時(shí)隊(duì)列跟實(shí)際上的實(shí)時(shí)隊(duì)列的差別---延時(shí)隊(duì)列分為兩種--一種是計(jì)時(shí)結(jié)束后需要立即執(zhí)行,另一種是計(jì)時(shí)結(jié)束后重新入隊(duì);
- 因?yàn)楸WC強(qiáng)可靠性,任務(wù)是否支持子任務(wù)或者叫任務(wù)遞歸,任務(wù)嵌套--比如自動(dòng)扣費(fèi)成功后產(chǎn)生生成訂單任務(wù)---在扣費(fèi)任務(wù)里提交生成訂單即可,不需要組件做管理;---第10點(diǎn)不用考慮;
- 單節(jié)點(diǎn)流量控制需要規(guī)避大任務(wù)阻當(dāng)小任務(wù)的情況發(fā)生---比如一個(gè)大任務(wù)擋住所有后續(xù)所有小任務(wù)的執(zhí)行;所以這里需要保證所有任務(wù)不是嚴(yán)格順序執(zhí)行的;比如一部分線程寧愿空著也不能消費(fèi)大任務(wù),這里可以做任務(wù)類型隊(duì)列,CPU密集型任務(wù)隊(duì)列,IO密集型任務(wù)隊(duì)列,總時(shí)間小的任務(wù)隊(duì)列,總時(shí)間長的任務(wù)隊(duì)列;-----衡量標(biāo)準(zhǔn)要考慮絕對(duì)參數(shù),自適應(yīng)性參數(shù)調(diào)節(jié)可能產(chǎn)生相對(duì)參數(shù);
文章來源:http://www.zghlxwxcb.cn/news/detail-615710.html
到了這里,關(guān)于分布式異步任務(wù)處理組件(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!