kafka消息重複消費

消息的重複消費在生產端和消費端都可能發生

  1. 生產端消息重複發送

發送消息如果配置了重試機制,比如由於網絡波動生產者未得到broker收到了消息的響應就會觸發重試機制,3秒後再次發送此消息。broker之前已經收到過這個消息,但生產者由於觸發了重試機制,就導致了消息的重複發送。那麼broker就會在磁盤緩存多條同樣的消息,消費端從broker拉取消息時,就會造成重複消費。

注意:kafka新版本已經在broker中保證了接收消息的冪等性(比如2.4版本),只需在生產者加上參數 props.put(“enable.idempotence”, true) 即可,默認是false不開啓。

  1. 消費端消息重複消費

對於消費端消息的重複消費問題,如果消費端拉取了一部分數據消費完畢後,準備執行手動提交(或自動提交)時消費者掛掉了!此時offset還未提交呢,那麼當服務重啓時還是會拉取相同的一批數據重複處理!造成消息重複消費

無論是生產者還是消費者的重複消息,一般都會在消費端卡死,做冪等性處理。

冪等性可以用redis的setnx分佈式鎖來實現。比如操作訂單消息,可以把訂單id作爲key,在消費消息時通過setnx命令設置一下,offset提交完成後在redis中刪除訂單id的key。setnx命令保證同樣的訂單消息只有一個能被消費,可有效保證消費的冪等性!

Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在時,爲 key 設置指定的值。key不存在時設置成功,返回 1 。 key已經存在時會設置失敗,返回 0 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章