小學(xué)生也能看懂的微服務(wù)節(jié)點(diǎn)判活難題
點(diǎn)擊上方“JavaEdge”,關(guān)注公眾號(hào)
那你首先,了解注冊(cè)中心摘除機(jī)制嗎?
【服務(wù)Consumer】以【注冊(cè)中心】的數(shù)據(jù)為準(zhǔn),當(dāng)服務(wù)端的節(jié)點(diǎn)有變更時(shí),【注冊(cè)中心】會(huì)將變更通知給【Consumer】,【Consumer】就調(diào)用【注冊(cè)中心】拉取最新節(jié)點(diǎn)信息。
這種機(jī)制一般也夠用了,但當(dāng)網(wǎng)絡(luò)頻繁抖動(dòng)時(shí),【服務(wù)Provider】向【注冊(cè)中心】匯報(bào)心跳信息可能失敗。若在規(guī)定時(shí)間內(nèi),【注冊(cè)中心】都未收到【Provider】的心跳信息,就會(huì)把該節(jié)點(diǎn)從可用節(jié)點(diǎn)列表中移除。
更糟的是,在服務(wù)池?fù)碛猩习賯€(gè)節(jié)點(diǎn)時(shí),每個(gè)節(jié)點(diǎn)都可能會(huì)被移除,導(dǎo)致【注冊(cè)中心】可用節(jié)點(diǎn)的狀態(tài)一直在變化,這該如何解決?
可考慮心跳開(kāi)關(guān)保護(hù)機(jī)制。
在網(wǎng)絡(luò)頻繁抖動(dòng)時(shí),【注冊(cè)中心】的可用節(jié)點(diǎn)不斷變化,【Consumer】會(huì)頻繁收到【Provider】節(jié)點(diǎn)變更信息,于是不斷請(qǐng)求【注冊(cè)中心】。
當(dāng)很多【Consumer】同時(shí)請(qǐng)求【注冊(cè)中心】,很容易把【注冊(cè)中心】帶寬打滿。
所以需要措施保證,即使網(wǎng)絡(luò)頻繁抖動(dòng),【Consumer】也不至于 同時(shí) 請(qǐng)求【注冊(cè)中心】。
就是給【注冊(cè)中心】設(shè)置一個(gè)開(kāi)關(guān)。
開(kāi)關(guān)打開(kāi)時(shí),即使網(wǎng)絡(luò)頻繁抖動(dòng),【注冊(cè)中心】也不會(huì)通知所有【Consumer】,比如只通知10%的【Consumer】,降低注冊(cè)中心需要處理的請(qǐng)求量。
那這種方案有什么問(wèn)題嗎?
技術(shù)都是有利有弊的,開(kāi)關(guān)的代價(jià)就是會(huì)導(dǎo)致【Consumer】感知最新服務(wù)節(jié)點(diǎn)信息延遲。所以應(yīng)該作為一個(gè)緊急措施,在網(wǎng)絡(luò)頻繁抖動(dòng)時(shí),才打開(kāi)開(kāi)關(guān)。
綜上,該機(jī)制是為避免【Provider】節(jié)點(diǎn)頻繁變更,而導(dǎo)致【Consumer】同時(shí)請(qǐng)求【注冊(cè)中心】。
那還有別的方案嗎?
是的,還有服務(wù)節(jié)點(diǎn)摘除保護(hù)機(jī)制。
【Provider】在進(jìn)程啟動(dòng)時(shí),會(huì)注冊(cè)服務(wù)到【注冊(cè)中心】,并每隔一段時(shí)間,匯報(bào)心跳給【注冊(cè)中心】,通知自己的存活狀態(tài)。
若隔了一段固定時(shí)間后,【Provider】仍沒(méi)有匯報(bào)心跳給【注冊(cè)中心】,【注冊(cè)中心】就會(huì)認(rèn)為該節(jié)點(diǎn)已死,將其從可用節(jié)點(diǎn)中移除。
若遇到網(wǎng)絡(luò)問(wèn)題,大批【Provider】節(jié)點(diǎn)匯報(bào)給【注冊(cè)中心】的心跳信息都可能會(huì)傳達(dá)失敗,【注冊(cè)中心】就會(huì)把它們都從可用節(jié)點(diǎn)列表中移除,造成剩下可用節(jié)點(diǎn)難以承受所有調(diào)用,引起“雪崩”。但這種情況下,可能大部分【Provider】節(jié)點(diǎn)是可用的,僅因?yàn)榫W(wǎng)絡(luò)原因無(wú)法匯報(bào)心跳給【注冊(cè)中心】就被“無(wú)情”摘除。
這就需要根據(jù)實(shí)際業(yè)務(wù),設(shè)定一個(gè)閾值比例,即使網(wǎng)絡(luò)抖動(dòng),【注冊(cè)中心】也不能摘除超過(guò)這個(gè)閾值比例的節(jié)點(diǎn)。通常設(shè)定在20%。因?yàn)榻^大部分時(shí)間,節(jié)點(diǎn)變化也不會(huì)變化頻繁,只有在如下情況才可能發(fā)生:
業(yè)務(wù)明確要下線大批節(jié)點(diǎn)
這種情況可預(yù)知,所以可以關(guān)閉閾值保護(hù)網(wǎng)絡(luò)抖動(dòng)
一般正常時(shí),應(yīng)打開(kāi)閾值保護(hù),以防網(wǎng)絡(luò)抖動(dòng)時(shí),大批量可用服務(wù)節(jié)點(diǎn)被摘除
綜上,該機(jī)制是為避免【Provider】節(jié)點(diǎn)被大量摘除,而導(dǎo)致【Consumer】可調(diào)用節(jié)點(diǎn)不足。
所以這兩種機(jī)制,都是因?yàn)椤咀?cè)中心】的節(jié)點(diǎn)信息瞬息萬(wàn)變,所以也經(jīng)常把【注冊(cè)中心】稱為【動(dòng)態(tài)注冊(cè)中心】。
我開(kāi)始疑惑了,那是否能另辟蹊徑,【Consumer】并不嚴(yán)格以【注冊(cè)中心】中的服務(wù)節(jié)點(diǎn)信息為準(zhǔn),而是更多的以【Consumer】實(shí)際調(diào)用信息來(lái)判斷【Provider】是否可用呢?
有的,這就是靜態(tài)注冊(cè)中心。
心跳機(jī)制能保證在【Provider】異常時(shí),【注冊(cè)中心】可以及時(shí)把不可用的【Provider】從可用節(jié)點(diǎn)列表中移除,這很好。
但仔細(xì)思考,為何不把這種心跳機(jī)制直接用在【Consumer】?
因?yàn)椤綪rovider】是向【Consumer】提供服務(wù),是否可用【Consumer】比【注冊(cè)中心】更清楚,因此可直接在【Consumer】端根據(jù)調(diào)用【Provider】是否成功,以判定【Provider】是否可用。
若【Consumer】調(diào)用某一【Provider】連續(xù)失敗超過(guò)一定次數(shù),可在本地內(nèi)存將該節(jié)點(diǎn)標(biāo)記為不可用。
每隔一段固定時(shí)間,【Consumer】向標(biāo)記為不可用的節(jié)點(diǎn)發(fā)起?;钐綔y(cè),若探測(cè)成功,就將標(biāo)記為不可用的節(jié)點(diǎn)再恢復(fù)為可用態(tài),重新發(fā)起調(diào)用。
這樣【Provider】無(wú)需再向【注冊(cè)中心】心跳匯報(bào),【注冊(cè)中心】中的服務(wù)節(jié)點(diǎn)信息也不會(huì)動(dòng)態(tài)變化,這就是【靜態(tài)注冊(cè)中心】。
很多公司也是一開(kāi)始采用動(dòng)態(tài)注冊(cè)中心,后來(lái)考慮到網(wǎng)絡(luò)的復(fù)雜性,心跳機(jī)制不一定可靠,而后開(kāi)始改為采用服務(wù)消費(fèi)者端的?;顧C(jī)制,事實(shí)證明這種機(jī)制足以應(yīng)對(duì)網(wǎng)絡(luò)頻繁抖動(dòng)等復(fù)雜場(chǎng)景。
【靜態(tài)注冊(cè)中心】中的服務(wù)節(jié)點(diǎn)信息并不是一直不變,當(dāng)在
業(yè)務(wù)上線
要把正在部署的服務(wù)節(jié)點(diǎn)從注冊(cè)中心中移除,等到服務(wù)部署完畢,完全可用的時(shí)候,再加入到注冊(cè)中心運(yùn)維人工增加或刪除服務(wù)節(jié)點(diǎn)
需要調(diào)用注冊(cè)中心提供的接口,添加節(jié)點(diǎn)信息或者刪除節(jié)點(diǎn)
這些預(yù)先感知場(chǎng)景,還是有必要修改【注冊(cè)中心】中的服務(wù)節(jié)點(diǎn)信息的。
看起來(lái)【靜態(tài)注冊(cè)中心】好像退化成了配置中心,只是這時(shí)配置中心存儲(chǔ)的不是某一項(xiàng)簡(jiǎn)單的配置,而是某服務(wù)的可用節(jié)點(diǎn)信息。
往期推薦
由于不知線程池的bug,某Java程序員叕被祭天
程序員因重復(fù)記錄日志撐爆ELK被辭退!
擁抱Kubernetes,再見(jiàn)了Spring Cloud
和阿里P8大佬面試互懟了半小時(shí)的Fork/Join原理!
目前交流群已有 800+人,旨在促進(jìn)技術(shù)交流,可關(guān)注公眾號(hào)添加筆者微信邀請(qǐng)進(jìn)群
喜歡文章,點(diǎn)個(gè)“在看、點(diǎn)贊、分享”素質(zhì)三連支持一下~
