使用Kafka時(shí),在消息的收發(fā)過(guò)程中都有可能會(huì)出現(xiàn)消息丟失。
一、生產(chǎn)者發(fā)送消息到broker過(guò)程中丟失
1. 設(shè)置異步發(fā)送
- 同步發(fā)送:會(huì)產(chǎn)生阻塞,一般使用異步發(fā)送。
- 異步發(fā)送:實(shí)現(xiàn)回調(diào)方法,消息發(fā)送失敗時(shí)記錄日志,或者重新發(fā)送,最終確保消息能夠成功發(fā)送。
2. 設(shè)置消息重試機(jī)制
- 由于網(wǎng)絡(luò)抖動(dòng)問(wèn)題,很快就會(huì)恢復(fù)正常,造成的消息丟失。
二、消息在broker中存儲(chǔ)過(guò)程中丟失
Kafka中提供了一種發(fā)送確認(rèn)機(jī)制,當(dāng)生產(chǎn)者發(fā)送的消息到broker中,這些消息會(huì)存儲(chǔ)在分區(qū)中。分區(qū)又分為leader和follower兩種副本角色,其中,leader只有1個(gè),follower可能有多個(gè)。分區(qū)收到消息后,首先保存到leader副本中,然后由leader副本把數(shù)據(jù)同步到follower副本中。
1. 發(fā)送確認(rèn)機(jī)制acks
- acks=all:在所有的分區(qū)副本保存之后,才會(huì)發(fā)送確認(rèn),可以保證消息不丟失;這也是性能最低的一種。
- 在實(shí)際的生產(chǎn)環(huán)境中,最低也要設(shè)置acks=1,起碼能讓leader副本保存數(shù)據(jù)。
三、消費(fèi)者從broker接收消息過(guò)程中丟失
一個(gè)Kafka集群是由多個(gè)broker(Kafka實(shí)例)組成,在每一個(gè)broker中存在不同的topic,且
1個(gè)topic可能存在多個(gè)分區(qū)(partition),分區(qū)也可能存在不同的broker中。
- 1個(gè)消費(fèi)者組中可能存在多個(gè)消費(fèi)者,它們都是消費(fèi)同一個(gè)topic,每個(gè)消費(fèi)者會(huì)去消費(fèi)該topic下不同分區(qū)中消息。
- 每個(gè)分區(qū)都是按照偏移量(offset)來(lái)存儲(chǔ)數(shù)據(jù)的,每個(gè)分區(qū)都是有順序的、不可變的消息隊(duì)列,且可以持續(xù)的添加消息。
- 分區(qū)中的消息都配備了一個(gè)序列號(hào),稱之為偏移量
- 同一個(gè)topic是由不同的消費(fèi)者組去消費(fèi)數(shù)據(jù)的,消費(fèi)者去消費(fèi)數(shù)據(jù)時(shí)也會(huì)按照偏移量去消費(fèi)。
- 默認(rèn)情況下,每個(gè)消費(fèi)者每個(gè)5秒自動(dòng)提交一次消費(fèi)偏移量
- 如果消費(fèi)者組出現(xiàn)重平衡情況,可能會(huì)重復(fù)消費(fèi)或者消息丟失
- 重平衡:消費(fèi)者組中某個(gè)消費(fèi)者宕機(jī),其負(fù)責(zé)消費(fèi)的分區(qū),交給組內(nèi)其他消費(fèi)者,重新分配消費(fèi)分區(qū)過(guò)程中可能會(huì)出現(xiàn)重復(fù)消費(fèi)或者消息丟失。
- 重復(fù)消費(fèi):某個(gè)消費(fèi)者宕機(jī)時(shí),當(dāng)前消費(fèi)偏移量是3,提交到Kafka的偏移量是1,導(dǎo)致重平衡后組內(nèi)消費(fèi)者重復(fù)消費(fèi)某些數(shù)據(jù)。
- 消息丟失:某個(gè)消費(fèi)者宕機(jī)時(shí),當(dāng)前消費(fèi)偏移量是1,提交到Kafka的偏移量是3,導(dǎo)致重平衡后組內(nèi)消費(fèi)者重復(fù)消費(fèi)某些數(shù)據(jù)。
1. 禁用自動(dòng)提交偏移量,改為手動(dòng)
導(dǎo)致這個(gè)原因就是消費(fèi)者自動(dòng)提交偏移量,提交的偏移量不準(zhǔn)確,造成重復(fù)消費(fèi)或者消息丟失??梢栽O(shè)置手動(dòng)提交偏移量,消費(fèi)多少就提交多少偏移量,如果宕機(jī)就不提交偏移量,這樣偏移量就準(zhǔn)確了。
- 同步提交:會(huì)阻塞
- 異步提交:如果消費(fèi)失敗,可能導(dǎo)致消費(fèi)偏移量不準(zhǔn)確
- 同步+異步組合提交:最佳方式
四、小結(jié)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-769600.html
五、模擬面試
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-769600.html
到了這里,關(guān)于【Kafka面試】Kafka如何保證消息不丟失?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!