1、生產(chǎn)者
1.1 丟失原因:
- kafka生產(chǎn)端異步發(fā)送消息后,不管broker是否響應(yīng),立即返回,偽代碼producer.send(msg),由于網(wǎng)絡(luò)抖動,導(dǎo)致消息壓根就沒有發(fā)送到broker端;
- kafka生產(chǎn)端發(fā)送消息超出大小限制,broker端接到以后沒法進(jìn)行存儲;
1.2 解決方案:
- 1、生產(chǎn)者調(diào)用異步回調(diào)消息。偽代碼如下: producer.send(msg,callback);
- 2、生產(chǎn)者增加消息確認(rèn)機(jī)制,設(shè)置生產(chǎn)者參數(shù):acks = all。partition的leader副本接收到消息,等待所有的follower副本都同步到了消息之后,才認(rèn)為本次生產(chǎn)者發(fā)送消息成功了;
- 3、生產(chǎn)者設(shè)置重試次數(shù)。比如:retries>=3,增加重試次數(shù)以保證消息的不丟失;
- 4、定義本地消息日志表,定時(shí)任務(wù)掃描這個(gè)表自動補(bǔ)償,做好監(jiān)控告警。
- 5、后臺提供一個(gè)補(bǔ)償消息的工具,可以手工補(bǔ)償。
2、Broker
2.1 丟失原因:
kafka broker集群接收到數(shù)據(jù)后會將數(shù)據(jù)進(jìn)行持久化存儲到磁盤,消息都是先寫入到頁緩存,然后由操作系統(tǒng)負(fù)責(zé)具體的刷盤任務(wù)或者使用fsync強(qiáng)制刷盤,如果此時(shí)Broker宕機(jī),且選舉一個(gè)落后leader副本很多的follower副本成為新的leader副本,那么落后的消息數(shù)據(jù)就會丟失。
2.2 解決方案:
-
1、同步刷盤(不太建議)。同步刷盤可以提高消息的可靠性,防止由于機(jī)器掉電等異常造成處于頁緩存而沒有及時(shí)寫入磁盤的消息丟失。但是會嚴(yán)重影響性能。
-
2、利用partition的多副本機(jī)制(建議)
unclean.leader.election.enable=false:數(shù)據(jù)丟失太多的副本不能選舉為leader副本,防止落后太多的消息數(shù)據(jù)而引起丟失;
replication.factor >= 3:消息分區(qū)的副本個(gè)數(shù),這個(gè)值建議設(shè)為>=3;
min.insync.replicas >1:消息寫入多少副本才算已提交,這個(gè)值必須大于1,這個(gè)是要求一個(gè)leader 至少感知到有至少一個(gè) follower還跟自己保持聯(lián)系;(replication.factor>min.insync.replicas 這樣消息才能保存成功)文章來源:http://www.zghlxwxcb.cn/news/detail-636663.html
3、消費(fèi)者
3.1 丟失原因:
- 1、消費(fèi)者配置了offset自動提交參數(shù)。enable.auto.commit=true。
- 2、消息者收到了消息,進(jìn)行了自動提交offset,kafka以為消費(fèi)者已經(jīng)消費(fèi)了這個(gè)消息,但其實(shí)剛準(zhǔn)備處理這個(gè)消息,還沒處理完成,消費(fèi)者自己掛了,此時(shí)這條消息就會丟失。
- 3、多線程消費(fèi)消息,某個(gè)線程處理消息出現(xiàn)異常,還是會出現(xiàn)自動提交offset。
3.2 解決方案:
- 1、消費(fèi)者關(guān)閉自動提交,采用手動提交offset。通過配置參數(shù):enable.auto.commit=false,關(guān)閉自動提交offset,在完成業(yè)務(wù)邏輯以后手動提交offset,這樣就不會丟失數(shù)據(jù)。
- 2、消費(fèi)者多線程處理業(yè)務(wù)邏輯,等待所有線程處理完成以后,才手工提交offset。
- 3、消費(fèi)者消費(fèi)消息需要進(jìn)行冪等處理,防止重復(fù)消費(fèi)。
4、假如kafka掛了,如何保證高可用?
消息生產(chǎn)服務(wù)A 所有消息入庫,然后通過 定時(shí)任務(wù)job 直接調(diào)用 消息消費(fèi)服務(wù)B。文章來源地址http://www.zghlxwxcb.cn/news/detail-636663.html
到了這里,關(guān)于Kafka 如何保證消息不丟失的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!