微服務(wù)廣播模式培漏,指的是在微服務(wù)多實例部署的場景下,將消息廣播到多個微服務(wù)實例的一種模式狮鸭。
廣播模式合搅,一般用來維護(hù)微服務(wù)的內(nèi)存數(shù)據(jù),根據(jù)數(shù)據(jù)類型的不同歧蕉,有助于解決兩類問題灾部。通常廣播模式會使用支持發(fā)布訂閱的消息中間件實現(xiàn)(如Redis、Kafka惯退、Pulsar等)赌髓,本文也基于消息中間件進(jìn)行討論。
利用廣播模式維護(hù)一致的緩存
這應(yīng)該是廣播模式利用最多的一種場景蒸痹,假想一個擁有海量用戶的電商網(wǎng)站春弥、或是一個億級設(shè)備連接的IoT平臺。勢必會存在一些緩存數(shù)據(jù)叠荠,像是用戶的購物車信息匿沛,或是設(shè)備的密鑰緩存。如果沒有廣播模式榛鼎,可能會存在這樣的問題
當(dāng)用戶更新了它的購物車之后逃呼,微服務(wù)實例1的數(shù)據(jù)發(fā)生了更新鳖孤,數(shù)據(jù)庫的數(shù)據(jù)也成功更新。但是微服務(wù)實例2中的緩存數(shù)據(jù)未能更新抡笼,那么如果用戶的請求均衡到了實例2苏揣,就會發(fā)生意想不到的后果。
這種情況下我們可以讓微服務(wù)1在廣播通道中發(fā)送一個緩存的invalidate消息推姻,將微服務(wù)實例2中該用戶的緩存清零平匈,使得微服務(wù)實例2在下一次處理該用戶的請求時,從數(shù)據(jù)庫中讀取最新的消息藏古。
使用該模式需要注意的點:
- 每個微服務(wù)實例應(yīng)該使用不同的消費組增炭,可以通過微服務(wù)的IP、主機(jī)名拧晕、UUID等拼裝成訂閱組名稱隙姿,這才稱得上廣播之名
- 微服務(wù)消費消息的時候,應(yīng)從Latest開始消費厂捞,避免從Earliest開始消費無用的緩存清理消息
- 由于每一次微服務(wù)重啟都會產(chǎn)生一個新的消費組输玷,需要注意消費組的老化,可以通過消息中間件自帶的不活躍消費組老化能力兜底靡馁,建議通過gracefulExit欲鹏、監(jiān)聽kill信號等機(jī)制來主動刪除消費組信息
為什么說消費組老化比較重要呢,因為很多監(jiān)控系統(tǒng)都會根據(jù)消費組的積壓來做告警奈嘿,很容易產(chǎn)生誤告警貌虾。
利用廣播模式維護(hù)內(nèi)存中的數(shù)據(jù)
這種模式相對比較少見,常見于key的基數(shù)不是很大裙犹,能夠?qū)?shù)據(jù)完整地存儲在內(nèi)存中尽狠,比如電商平臺的企業(yè)賣家個數(shù)、物聯(lián)網(wǎng)平臺的用戶個數(shù)等叶圃,并且對數(shù)據(jù)的一致性要求不是很高(因為廣播模式情況下袄膏,對于兩個微服務(wù)實例來說沒有一致性保障)。像Apache Pulsar設(shè)計的TableView掺冠,在我看來沉馆,就是做這個事的一個最佳實踐。Pulsar內(nèi)部大量使用了topic存儲數(shù)據(jù)德崭,就是采用這個方式斥黑。
使用該模式需要注意的點:
- 同上,需要使用不同的消費組名稱
- 微服務(wù)消費消息的時候眉厨,應(yīng)該從Earliest開始消費锌奴,保證所有微服務(wù)內(nèi)存中的消息視圖一致
- 同上,需要注意消費組的老化
為什么需要消費組老化作為保底手段
因為在極端場景下憾股,無論是graceful的代碼鹿蜀,還是監(jiān)聽kill信號的代碼箕慧,都不能保證代碼百分百地被執(zhí)行。需要兜底茴恰。
Kafka消費組老化
Kafka通過offsets.retention.minutes參數(shù)控制消費組中offsets保留時間颠焦,在此時間內(nèi)如果沒有提交offset,offsets將會被刪除往枣。Kafka判定消息組中沒有在線的消費者(如empty狀態(tài))伐庭,且沒有offsets時,將會刪除此消費組婉商。
Pulsar消費組老化
pulsar的消費組老化策略更加靈活似忧,可以配置到namespace級別渣叛。
bin/pulsar-admin namespaces | grep expiration
get-subscription-expiration-time Get subscription expiration time for
Usage: get-subscription-expiration-time [options] tenant/namespace
set-subscription-expiration-time Set subscription expiration time for
Usage: set-subscription-expiration-time [options] tenant/namespace
Subscription expiration time in minutes
remove-subscription-expiration-time Remove subscription expiration
Usage: remove-subscription-expiration-time [options] tenant/namespace
這里注意要合理地配置消費組的老化時間丈秩,在pulsar的當(dāng)前版本(2.11版本)下,catch up讀淳衙,也就是說消費組平時積壓量不大蘑秽。如果將消費組的老化時間配置大于等于消息的老化時間,會出現(xiàn)消費組老化不了的現(xiàn)象箫攀。
當(dāng)然肠牲,由于消費組和消息老化都是定時任務(wù),預(yù)估時間時靴跛,要考慮一定的buffer缀雳。
這里讓我們稍稍dive一下原理,消費組的老化是通過判斷Cursor游標(biāo)的LastActive time來判斷能否老化的梢睛。如果該消費組的游標(biāo)位置到達(dá)了消息老化區(qū)域肥印,被老化掉了,消費組的游標(biāo)位置就會強(qiáng)制更新到一個可用的位置绝葡,這個時候會更新游標(biāo)的LastActive time到當(dāng)前時間深碱,周而復(fù)始,導(dǎo)致消費組無法老化藏畅。舉個??
假設(shè)消費組的老化時間為4h敷硅,消息的老化時間為3h,就可能會發(fā)生這樣的事情
總結(jié)
廣播模式在微服務(wù)架構(gòu)中起到了重要的角色愉阎,尤其是在需要在微服務(wù)實例之間同步數(shù)據(jù)的場景中绞蹦,它具有顯著的優(yōu)勢。它能夠幫助維護(hù)內(nèi)存數(shù)據(jù)的緩存一致性榜旦。希望本篇文章能提供您全面的廣播模式的知識幽七。