Kafka 會(huì)丟失信息嗎?
許多開(kāi)發(fā)人員普遍認(rèn)為,Kafka 的設(shè)計(jì)本身就能保證不會(huì)丟失消息。然而,Kafka 架構(gòu)和配置的細(xì)微差別會(huì)導(dǎo)致消息的丟失。我們需要了解它如何以及何時(shí)可能丟失消息,并防止此類(lèi)情況的發(fā)生。
下圖顯示了消息在 Kafka 的生命周期中可能丟失的場(chǎng)景。
圖片
當(dāng)我們調(diào)用 producer.send() 發(fā)送消息時(shí),消息不會(huì)直接發(fā)送到代理。
消息發(fā)送過(guò)程涉及兩個(gè)線(xiàn)程和一個(gè)隊(duì)列:
我們需要為生產(chǎn)者配置適當(dāng)?shù)?"acks "和 "retries",以確保消息被發(fā)送到代理。
當(dāng)代理集群正常運(yùn)行時(shí),它不應(yīng)該丟失消息。但是,我們需要了解哪些極端情況可能會(huì)導(dǎo)致消息丟失:
Kafka 提供了不同的提交消息的方式。自動(dòng)提交可能會(huì)在實(shí)際處理記錄之前確認(rèn)對(duì)記錄的處理。當(dāng)消費(fèi)者在處理過(guò)程中宕機(jī)時(shí),有些記錄可能永遠(yuǎn)不會(huì)被處理。
一個(gè)好的做法是將同步提交和異步提交結(jié)合起來(lái),在處理消息的循環(huán)中使用異步提交以提高吞吐量,在異常處理中使用同步提交以確保最后的偏移始終被提交。
下圖是這個(gè)方法的偽代碼:
try { while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000)); for (ConsumerRecord<String, String> record : records) { // process records one by one } consumer.commitAsync(); }} catch (Exception e){ // exception handling } finally { try { consumer.commitSync(); } finally { consumer.close(); } }
本文鏈接:http://www.www897cc.com/showinfo-26-82370-0.html什么?你告訴我 Kafka 會(huì)丟消息?
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 配置Nginx訪(fǎng)問(wèn)阿里云OSS資源踩坑之路
下一篇: 我們一起聊聊如何使用Spring Boot 3 和 Redis 實(shí)現(xiàn)實(shí)時(shí)智能客服系統(tǒng)