定時(shí)任務(wù)的灰度發(fā)布實(shí)現(xiàn)思路
1、啟動(dòng)階段-注冊(cè)執(zhí)行節(jié)點(diǎn)
所有執(zhí)行節(jié)點(diǎn)在啟動(dòng)的時(shí)候注冊(cè)自己能執(zhí)行哪些定時(shí)任務(wù)
執(zhí)行節(jié)點(diǎn)如果停機(jī)重啟(如:停機(jī)重啟,發(fā)布重啟),主節(jié)點(diǎn)會(huì)感知這個(gè)變化,從而從上述注冊(cè)中剝離該執(zhí)行節(jié)點(diǎn),后續(xù)任務(wù)就不會(huì)再分配到原先節(jié)點(diǎn)
2、啟動(dòng)階段-選舉管理節(jié)點(diǎn),
所有節(jié)點(diǎn)注冊(cè)完畢,會(huì)參與選舉,產(chǎn)生一個(gè)管理節(jié)點(diǎn)
管理節(jié)點(diǎn)可以參與或不參與任務(wù)執(zhí)行。
管理節(jié)點(diǎn)隨機(jī)在執(zhí)行節(jié)點(diǎn)中產(chǎn)生,如果管理節(jié)點(diǎn)停機(jī),zk會(huì)感知并通知所有節(jié)點(diǎn)重新選舉產(chǎn)生新管理節(jié)點(diǎn)。
3、運(yùn)行階段-管理節(jié)點(diǎn)創(chuàng)建定時(shí)任務(wù)實(shí)例,分配給合適的執(zhí)行節(jié)點(diǎn)
管理節(jié)點(diǎn)選舉出來,就會(huì)周期性的掃描定時(shí)任務(wù)模版,提前創(chuàng)建定時(shí)任務(wù)實(shí)例并分配執(zhí)行節(jié)點(diǎn), 分配執(zhí)行節(jié)點(diǎn)其實(shí)是更新實(shí)例的節(jié)點(diǎn)字段。 這叫做主動(dòng)分配。
管理節(jié)點(diǎn)為任務(wù)實(shí)例分配執(zhí)行節(jié)點(diǎn)時(shí)遍歷具備該業(yè)務(wù)執(zhí)行能力的執(zhí)行節(jié)點(diǎn)集合,依次分發(fā)給執(zhí)行節(jié)點(diǎn),
開始時(shí)記錄開始節(jié)點(diǎn),每輪掃描回到開始節(jié)點(diǎn),就結(jié)束為本實(shí)例分配執(zhí)行節(jié)點(diǎn)動(dòng)作
如果此節(jié)點(diǎn)沒有執(zhí)行節(jié)點(diǎn),就放棄等待下一輪掃描。
4、運(yùn)行階段-執(zhí)行節(jié)點(diǎn)收到通知,掃描執(zhí)行任務(wù)實(shí)例
管理節(jié)點(diǎn)分配定時(shí)任務(wù)實(shí)例后,會(huì)通知執(zhí)行節(jié)點(diǎn),
執(zhí)行節(jié)點(diǎn)受到通知,會(huì)到數(shù)據(jù)庫里撈取執(zhí)行分配給自己的待執(zhí)行任務(wù)實(shí)例
5、 關(guān)于灰度發(fā)布
發(fā)布人員會(huì)修改系統(tǒng)參數(shù)greyRegions,并刷新到緩存
發(fā)布人員會(huì)停機(jī)需要升級(jí)灰度版本的部分節(jié)點(diǎn),修改配置標(biāo)記為灰度節(jié)點(diǎn)
發(fā)布人員發(fā)布灰度應(yīng)用并啟動(dòng)應(yīng)用實(shí)例
灰度節(jié)點(diǎn)啟動(dòng)過程中重新注冊(cè)到定時(shí)任務(wù)管理機(jī)制中,標(biāo)記自己是灰度節(jié)點(diǎn),注冊(cè)自己的定時(shí)任務(wù)業(yè)務(wù)能力,參與執(zhí)行分配
管理節(jié)點(diǎn)發(fā)現(xiàn)要執(zhí)行的實(shí)例屬于灰度region時(shí),會(huì)尋找具備該能力的灰度節(jié)點(diǎn)執(zhí)行該定時(shí)任務(wù),
如果沒有找到就放棄等待下一輪再掃,可能此時(shí)灰度節(jié)點(diǎn)還沒有啟動(dòng)或注冊(cè)加入執(zhí)行節(jié)點(diǎn)集合。