1 背景
在讀完kafka官方文檔,kafka設(shè)計(jì)里的消息交付語(yǔ)義一章后,給我的第一印象是內(nèi)容很抽象,于是草擬和總結(jié)了給個(gè)副標(biāo)題,并把相關(guān)內(nèi)容進(jìn)行了歸類;有些生澀的句子,盡量用大白話和舉例進(jìn)行說(shuō)明,并加入了總結(jié)。
消息交付語(yǔ)義的級(jí)別有哪些?
消息交付,即消息在生產(chǎn)端,broker端,消費(fèi)者端的傳遞保證。
最多一次——消息可能會(huì)丟失,但永遠(yuǎn)不會(huì)重新傳送。
至少一次——消息永遠(yuǎn)不會(huì)丟失,但可以重新傳送。
恰好一次——這就是人們真正想要的,每條消息都傳遞一次且僅一次。
kafka 支持哪些消息交付語(yǔ)義?
根據(jù)英文文檔,進(jìn)行了總結(jié)
###################以下為個(gè)人觀點(diǎn)###################
kafka 真的支持了 最少一次 的交付語(yǔ)義嗎?
我的回答是:不同的條件下,可能支持了,也可能沒(méi)支持。
kafka支持最少一次交付的前提條件
生產(chǎn)端:
kafka生產(chǎn)端在發(fā)送消息時(shí),如果遇到底層網(wǎng)絡(luò)問(wèn)題,可能會(huì)導(dǎo)致消息發(fā)送給了broker端,也有可能網(wǎng)絡(luò)閃斷或者丟包,發(fā)送的消息可能丟了;但最后的結(jié)果是,生產(chǎn)端會(huì)根據(jù)指定的參數(shù)retries,進(jìn)行一定次數(shù)的重試。以此來(lái)保證生產(chǎn)端,做到消息至少傳遞一次。即發(fā)送失敗了,就重試吧。
所以生產(chǎn)端 支持"最少一次"的前提條件 有如下:
生產(chǎn)端的應(yīng)用在重試的時(shí)候,沒(méi)有重啟,或者宕機(jī)
網(wǎng)絡(luò),或者broker端,需要在生產(chǎn)端重試次數(shù)用完之前恢復(fù)
消費(fèi)者端:
消費(fèi)者端保證消息至少被消費(fèi)一次的建議是:在消費(fèi)者端消費(fèi)完消息后,在手工提交offset;偽代碼如下:
while(true){ consumer.poll(); XXX consumer.commit(); }
具體原因和說(shuō)明見(jiàn):juejin.cn/post/729328…
broker端:
broker端,要實(shí)現(xiàn)此交付,主要是保證消息不丟。kafka 數(shù)據(jù)是具備高可靠的,但不代表你的kafka集群就具備了此功能。需要有如下配置:
第一:生產(chǎn)端參數(shù)ack 設(shè)置為all
第二:在broker端 配置min.insync.replicas參數(shù)設(shè)置至少為2
第三:在broker端配置replicator.factor參數(shù)至少3
第四:在broker端配置 unclean.leader.election.enable 參數(shù)建議設(shè)置為false
具體原因和說(shuō)明見(jiàn):juejin.cn/post/729328…
不支持的情況下,如何去保證消息交付最少一次的保證
消費(fèi)者端和broker端,可以根據(jù)配置和對(duì)應(yīng)代碼編寫(xiě)順序進(jìn)行解決;但生產(chǎn)端在進(jìn)行重試時(shí),還需依賴生產(chǎn)端應(yīng)用的穩(wěn)定性,底層網(wǎng)絡(luò)和broker端的可用性;
生產(chǎn)端之所以需要這三個(gè)條件的支持,還是生產(chǎn)端沒(méi)有把待發(fā)送消息進(jìn)行持久化,畢竟待發(fā)送的消息是保存在jvm內(nèi)存中的,jvm重啟或者OOM或者宕機(jī)了,內(nèi)存中的消息也就丟了;
如果把待發(fā)送的消息進(jìn)行了持久化,即使應(yīng)用宕機(jī),網(wǎng)絡(luò)失敗,broker不可用,但在經(jīng)過(guò)應(yīng)用重啟,網(wǎng)絡(luò)和broker恢復(fù),也可以保證待發(fā)送消息不丟失,做到消息的至少一次交付。
審核編輯:湯梓紅
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3109瀏覽量
75004 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7769瀏覽量
90403 -
kafka
+關(guān)注
關(guān)注
0文章
53瀏覽量
5363
原文標(biāo)題:kafka的消息交付語(yǔ)義 真的支持了最少一次嗎?
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
kafka設(shè)計(jì)原理的深度探討

Kafka基礎(chǔ)入門(mén)文檔
Kafka集群環(huán)境的搭建
阿里云消息隊(duì)列Kafka商業(yè)化:支持消息無(wú)縫遷移到云上

如何將物聯(lián)網(wǎng)數(shù)據(jù)從設(shè)備連接到Kafka集群?
Kafka的概念及Kafka的宕機(jī)

Kafka 的簡(jiǎn)介

物通博聯(lián)5G-kafka工業(yè)網(wǎng)關(guān)實(shí)現(xiàn)kafka協(xié)議對(duì)接到云平臺(tái)
Spring Kafka的各種用法
Kafka架構(gòu)技術(shù):Kafka的架構(gòu)和客戶端API設(shè)計(jì)

評(píng)論