Kafka 會丟失信息嗎?
許多開發人員普遍認為,Kafka 的設計本身就能保證不會丟失消息。然而,Kafka 架構和配置的細微差別會導致消息的丟失。我們需要了解它如何以及何時可能丟失消息,并防止此類情況的發生。
下圖顯示了消息在 Kafka 的生命周期中可能丟失的場景。
01 生產者(Producer)
當我們調用 producer.send() 發送消息時,消息不會直接發送到代理。
消息發送過程涉及兩個線程和一個隊列:
- 應用程序線程
- 消息累加器
- 發送線程(I/O 線程)
我們需要為生產者配置適當的 "acks "和 "retries",以確保消息被發送到代理。
02 消息代理(Broker)
當代理集群正常運行時,它不應該丟失消息。但是,我們需要了解哪些極端情況可能會導致消息丟失:
- 為了提高 I/O 吞吐量,消息通常會異步刷到磁盤上,因此如果實例在刷新之前宕機,消息就會丟失。
- Kafka 集群中的副本需要正確配置,以保持數據的有效副本。數據同步的確定性非常重要。
03 消費者(Consumer)
Kafka 提供了不同的提交消息的方式。自動提交可能會在實際處理記錄之前確認對記錄的處理。當消費者在處理過程中宕機時,有些記錄可能永遠不會被處理。
一個好的做法是將同步提交和異步提交結合起來,在處理消息的循環中使用異步提交以提高吞吐量,在異常處理中使用同步提交以確保最后的偏移始終被提交。
下圖是這個方法的偽代碼:
try{
while(true){
ConsumerRecordsrecords=consumer.poll(Duration.ofMillis(1000));
for(ConsumerRecordrecord:records){
//processrecordsonebyone
}
consumer.commitAsync();
}
}catch(Exceptione){
//exceptionhandling
}finally{
try{
consumer.commitSync();
}finally{
consumer.close();
}
}
-
架構
+關注
關注
1文章
514瀏覽量
25470 -
線程
+關注
關注
0文章
504瀏覽量
19682 -
kafka
+關注
關注
0文章
51瀏覽量
5221
原文標題:面試官:Kafka 會丟消息嗎?
文章出處:【微信號:小林coding,微信公眾號:小林coding】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論