相信很多的小伙伴在面試的時(shí)候,涉及到MQ的面試題,消息丟失是必問(wèn)面試題之一。那么對(duì)于消息丟失你又是如何理解的呢?feM28資訊網(wǎng)——每日最新資訊28at.com
下面我們一起來(lái)看一下。feM28資訊網(wǎng)——每日最新資訊28at.com
本文以 Kafka 舉例說(shuō)明。feM28資訊網(wǎng)——每日最新資訊28at.com
feM28資訊網(wǎng)——每日最新資訊28at.com
feM28資訊網(wǎng)——每日最新資訊28at.com
一、什么是消息丟失?
消息丟失的定義是:在消息傳遞的過(guò)程中,在某個(gè)環(huán)節(jié)意外丟失,也就是消息沒(méi)有成功的發(fā)送或者沒(méi)有被正確的接收。feM28資訊網(wǎng)——每日最新資訊28at.com
生產(chǎn)者未能成功發(fā)送消息。feM28資訊網(wǎng)——每日最新資訊28at.com
feM28資訊網(wǎng)——每日最新資訊28at.com
消費(fèi)者未能正確接收消息。feM28資訊網(wǎng)——每日最新資訊28at.com
feM28資訊網(wǎng)——每日最新資訊28at.com
消費(fèi)者未能正確處理消息。feM28資訊網(wǎng)——每日最新資訊28at.com
feM28資訊網(wǎng)——每日最新資訊28at.com
對(duì)于第三條可以理解為特殊的消息丟失,因?yàn)橄M(fèi)者的邏輯處理錯(cuò)誤,程序bug等其他原因,造成消息在處理過(guò)程中消息丟失或者被忽略(異常之后錯(cuò)誤的應(yīng)答等),也就是說(shuō)消息沒(méi)有正確的被消費(fèi)掉,我們也可以認(rèn)為是一種消息丟失。feM28資訊網(wǎng)——每日最新資訊28at.com
二、消息丟失的原因有哪些
1.消息生產(chǎn)階段
- 生產(chǎn)者配置錯(cuò)誤:生產(chǎn)者在發(fā)送消息時(shí),配置錯(cuò)誤的主體、分區(qū)或者消息的過(guò)期時(shí)間,造成消息無(wú)法正確發(fā)送到MQ中。
- 網(wǎng)絡(luò)故障:生產(chǎn)者與MQ集群之間網(wǎng)絡(luò)故障。
2.消息存儲(chǔ)階段
- 磁盤(pán)故障:以Kafka舉例,如果磁盤(pán)出現(xiàn)故障,Kafka中的消息無(wú)法洛盤(pán),可能導(dǎo)致消息的丟失。
- 日志壓縮策略:使用了壓縮比較高的壓縮策略從而可能在壓縮的過(guò)程中丟失消息。
3.消息消費(fèi)階段
- 消費(fèi)者處理失敗:在處理消費(fèi)邏輯時(shí),由于程序bug等原因,造成系統(tǒng)異常,錯(cuò)誤應(yīng)答從而丟失消息。
- 消費(fèi)者提交偏移量錯(cuò)誤:當(dāng)消費(fèi)者消費(fèi)完消息之后,提交錯(cuò)誤的偏移量造成消息的重復(fù)消費(fèi)或者消息丟失。
三、消息丟失的解決方案有哪些
1.消息生產(chǎn)階段
(1) 配置正確的主體、分區(qū)、以及TTL。feM28資訊網(wǎng)——每日最新資訊28at.com
(2) 使用ACK應(yīng)答,等待消息被MQ寫(xiě)入成功之后在確認(rèn)為發(fā)送成功。feM28資訊網(wǎng)——每日最新資訊28at.com
- ack=1:默認(rèn)值,leader副本成功寫(xiě)入消息即發(fā)送成功。
- ack=0:發(fā)送消息后不等待服務(wù)端確認(rèn)。
- ack=-1或者ack=all:生產(chǎn)者需要等待ISR中的所有副本都成功寫(xiě)入消息才為消息發(fā)送成功。
(3) 消息發(fā)送重試。feM28資訊網(wǎng)——每日最新資訊28at.com
- retries:配置生產(chǎn)者發(fā)送消息重試次數(shù)。
(4) 配置合理的壓縮策略。feM28資訊網(wǎng)——每日最新資訊28at.com
- compression.type 支持none、gzip、snappy、lz4、zstd。
(5) 設(shè)置合理的消息緩沖區(qū)大小。feM28資訊網(wǎng)——每日最新資訊28at.com
- buffer.memory:默認(rèn)33554432。生產(chǎn)者用于緩存一批發(fā)送到服務(wù)器消息的總內(nèi)存字節(jié)數(shù)。
(6) 使用合適的序列化器,防止序列號(hào)錯(cuò)誤造成消息丟失。feM28資訊網(wǎng)——每日最新資訊28at.com
其他的配置可以參考官網(wǎng) Kafka 生產(chǎn)者配置:https://kafka.apache.org/documentation/#producerconfigsfeM28資訊網(wǎng)——每日最新資訊28at.com
2.消息存儲(chǔ)階段
- 配置適當(dāng)?shù)母北緮?shù)量和ISR。在發(fā)生故障的時(shí)候消息仍然可以從其他的副本中進(jìn)行恢復(fù)。
- 使用監(jiān)控,實(shí)時(shí)檢測(cè)消息的復(fù)制、磁盤(pán)的使用率。
- 定期備份。
3.消息消費(fèi)階段
(1) 編寫(xiě)健壯的代碼,說(shuō)的容易,寫(xiě)起來(lái)還是得多測(cè)試。對(duì)于可能產(chǎn)生的異常原因進(jìn)行分析處理。當(dāng)發(fā)生異常時(shí),可以做如下處理:feM28資訊網(wǎng)——每日最新資訊28at.com
- 記錄錯(cuò)誤,有異常處理機(jī)制,保證能夠正確的處理異常情況。
- 消息重試消息。(需要注意消費(fèi)冪等以及死循環(huán)造成消息堆積)
(2) 使用手動(dòng)提交偏移量。(需保證所有的異常情況代碼中都有對(duì)應(yīng)的異常處理機(jī)制,也就是第一點(diǎn),健壯的代碼)feM28資訊網(wǎng)——每日最新資訊28at.com
(3) 使用自動(dòng)提交偏移量。(需要保證消費(fèi)邏輯正確)feM28資訊網(wǎng)——每日最新資訊28at.com
(4) 使用監(jiān)控,監(jiān)控消費(fèi)者的消費(fèi)情況,發(fā)現(xiàn)異常立即上報(bào)。feM28資訊網(wǎng)——每日最新資訊28at.com
(5) 正確的消費(fèi)者組管理,類(lèi)似消費(fèi)者重平衡或者重啟等造成的消息偏移量丟失。feM28資訊網(wǎng)——每日最新資訊28at.com
(6) 備份,發(fā)生異常或者消息丟失時(shí),可以跟蹤到消費(fèi)者的消費(fèi)情況,直接使用備份恢復(fù)。feM28資訊網(wǎng)——每日最新資訊28at.com
總結(jié)
上面我們分析了什么是消息丟失,產(chǎn)生的原因有哪些以及如何解決。通過(guò)看完這篇文章相信你對(duì)Kafka中的消息丟失也有了一定的了解,在工作中使用的時(shí)候也就不會(huì)沒(méi)有底氣了。feM28資訊網(wǎng)——每日最新資訊28at.com
相信有眼尖的小伙伴發(fā)現(xiàn)了,在消費(fèi)者的處理邏輯中,多次消費(fèi)會(huì)造成消息的多次重復(fù)消費(fèi)。消息的重試也有可能造成消息的堆積。那么這些問(wèn)題就是下節(jié)課我們要說(shuō)的。feM28資訊網(wǎng)——每日最新資訊28at.com
本文鏈接:http://www.tebozhan.com/showinfo-26-92457-0.html面試官:對(duì)于 MQ 中的消息丟失你是如何理解的?
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 面試官:對(duì)于MQ中的消息堆積你是怎么理解的?
下一篇: 記一次 .NET某工控視覺(jué)自動(dòng)化系統(tǒng)卡死分析