哪些情況會發生消息丟失
從生產端到消費端都有可能發生消息丟失的情況,也就是在Producer生產者、Broker服務端、Consumer消費者都會發生這個消息丟失
怎么保證消息不丟失
Producer生產者
- 生產者會有自己的應答確認配置acks:acks=0代表無需任何響應,只管發不管發送是否成功,最容易丟失數據,性能最好;acks=1(生產者默認配置)代表服務端leader收到消息無需等副本同步之后立即響應,如果leader掛了就會丟失數據;ack=1代表服務端leader收到消息并且ISR副本收到消息之后再響應,可以保證消息不丟失,但是性能最差。
- 生產者發送失敗會有重試機制
Broker服務端
- 消息持久化:Broker服務端收到消息之后會持久化到磁盤,消息會先寫入page cache,然后定期刷盤,kafka不支持同步刷盤
- 副本復制機制:副本會從leader復制消息,當leader掛掉之后,會從副本中選出一個新的leader
Consumer消費者
Consumer消費者只可能是消費失敗但是仍然提交了offset才會導致消息丟失。可以把消費者的自動提交關閉,手動進行提交。另外對程序進行異常捕獲,發生異常可以重試消費或者人工兜底等手段避免消息丟失