節(jié)點(diǎn)上線和下線的邏輯--
節(jié)點(diǎn)下線分為兩種--心跳失敗主動(dòng)或被動(dòng)和主節(jié)點(diǎn)斷開連接,但是節(jié)點(diǎn)本身沒有發(fā)生重啟;第二種就是節(jié)點(diǎn)宕機(jī)重啟--其實(shí)這兩中情況下處理邏輯都是一樣的,只是節(jié)點(diǎn)本身如果還能消費(fèi)到kafka的時(shí)候可以繼續(xù)執(zhí)行任務(wù)但是不能從kafka中拉取新的消息,因?yàn)榇藭r(shí)自己無法獲取消息的投票信息,在執(zhí)行的過程中可以提交;執(zhí)行完之后還沒有重新加入集群則應(yīng)該斷開和kafka的鏈接---
可以不和kafka斷開連接的原因是此時(shí)自己和kafka的消息不回被其他節(jié)點(diǎn)消費(fèi),所以執(zhí)行隊(duì)列中的任務(wù)可以正常執(zhí)行并提交;但是存疑隊(duì)列中無法舉證所以只能等待----具體看是否要等待執(zhí)行完;--主要綜合考慮存疑隊(duì)列;
消息消費(fèi)模型--
如何保證一個(gè)消息只會(huì)被執(zhí)行一次---從幾個(gè)方面保證--一個(gè)消息最多可能存在于兩個(gè)節(jié)點(diǎn)中(除非多個(gè)節(jié)點(diǎn)都在執(zhí)行消息的時(shí)候失敗,這種概率是很小的),消息出現(xiàn)在其他節(jié)點(diǎn)中的情況--partition重分配,則該節(jié)點(diǎn)執(zhí)行隊(duì)列中的消息可能被其他節(jié)點(diǎn)消費(fèi),但是只會(huì)進(jìn)入到其他節(jié)點(diǎn)的存疑隊(duì)列中,而不是直接被執(zhí)行,存疑隊(duì)列通過舉證和執(zhí)行檢查策略保證該消息沒有即將被執(zhí)行或者正在被執(zhí)行或者最終被執(zhí)行完成;才可以重新執(zhí)行;---有一種情況,該節(jié)點(diǎn)開始執(zhí)行任務(wù)了,但是此時(shí)斷開和主節(jié)點(diǎn)的鏈接,而恰好其他節(jié)點(diǎn)對(duì)該任務(wù)舉證,這會(huì)導(dǎo)致該任務(wù)有可能被其他節(jié)點(diǎn)執(zhí)行---這里需要在每個(gè)任務(wù)執(zhí)行前向主節(jié)點(diǎn)匯報(bào);文章來源:http://www.zghlxwxcb.cn/news/detail-621377.html
幾個(gè)確定性機(jī)制可以保證消息不會(huì)被重復(fù)執(zhí)行--文章來源地址http://www.zghlxwxcb.cn/news/detail-621377.html
- 投票進(jìn)入執(zhí)行隊(duì)列中的任務(wù)肯定可以被執(zhí)行---在和主節(jié)點(diǎn)正常連接的情況下;
- 和主節(jié)點(diǎn)斷開連接的節(jié)點(diǎn)不能繼續(xù)執(zhí)行任務(wù),可能錯(cuò)過舉證,需要清空?qǐng)?zhí)行隊(duì)列;
- 任務(wù)執(zhí)行前需要向主節(jié)點(diǎn)匯報(bào)--保證該任務(wù)在執(zhí)行過程中和主節(jié)點(diǎn)斷開連接不會(huì)讓該任務(wù)被其他執(zhí)行;---斷開連接就清空?qǐng)?zhí)行隊(duì)列保證未執(zhí)行的任務(wù)在斷開連接之后可以被其他節(jié)點(diǎn)執(zhí)行,但是自己不會(huì)再重復(fù)執(zhí)行;
- 存異隊(duì)列中的任務(wù)必須通過舉證--通過舉證則證明主節(jié)點(diǎn)運(yùn)行正常;
- 舉證通過保證沒有節(jié)點(diǎn)即將執(zhí)行該任務(wù)或者正在執(zhí)行該任務(wù);--對(duì)于即將執(zhí)行的任務(wù)可以采取重新分配的策略;或者使用監(jiān)聽策略;正在執(zhí)行的任務(wù)使用超時(shí)+檢查來確定該任務(wù)的最終執(zhí)行情況;
- 一種情況---節(jié)點(diǎn)A準(zhǔn)備執(zhí)行任務(wù)a,向主節(jié)點(diǎn)發(fā)送了a的prepare信息,開始執(zhí)行,但是在執(zhí)行過程中主節(jié)點(diǎn)失敗,重新選舉,導(dǎo)致a的prepare信息丟失,同時(shí)節(jié)點(diǎn)A沒有加入到新集群中--沒有和新的主節(jié)點(diǎn)建立連接,此時(shí)節(jié)點(diǎn)B對(duì)任務(wù)a發(fā)起舉證,會(huì)導(dǎo)致a舉證通過,(舉證完成之后運(yùn)行檢查策略節(jié)點(diǎn)A沒有執(zhí)行完,此時(shí)節(jié)點(diǎn)B運(yùn)行檢查策略也會(huì)通過)節(jié)點(diǎn)B準(zhǔn)備執(zhí)行a,這種情況下會(huì)導(dǎo)致任務(wù)a同時(shí)被AB兩個(gè)節(jié)點(diǎn)執(zhí)行----這種情況無法避免,通過時(shí)差來保證,或者全節(jié)點(diǎn)同步prepare信息來保證,但是會(huì)影響性能,可以想辦法降低概率來保證---目前只有這種情況會(huì)導(dǎo)致同一個(gè)任務(wù)被多個(gè)節(jié)點(diǎn)執(zhí)行;
- 未開始執(zhí)行的任務(wù)不會(huì)導(dǎo)致這種情況發(fā)生--因?yàn)楣?jié)點(diǎn)和主節(jié)點(diǎn)斷開連接之后不會(huì)執(zhí)行新的任務(wù),而是要重新舉證才可以執(zhí)行;而通過舉證的消息
到了這里,關(guān)于分布式異步任務(wù)處理組件(五)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!