【消息队列】kafka是如何保证消息不被重复消费的
一、kafka自帶的消費機制
kafka有個offset的概念,當每個消息被寫進去后,都有一個offset,代表他的序號,然后consumer消費該數(shù)據(jù)之后,隔一段時間,會把自己消費過的消息的offset提交一下,代表我已經(jīng)消費過了。下次我要是重啟,就會繼續(xù)從上次消費到的offset來繼續(xù)消費。
但是當我們直接kill進程了,再重啟。這會導(dǎo)致consumer有些消息處理了,但是沒來得及提交offset。等重啟之后,少數(shù)消息就會再次消費一次。
其他MQ也會有這種重復(fù)消費的問題,那么針對這種問題,我們需要從業(yè)務(wù)角度,考慮它的冪等性。
?
二、通過保證消息隊列消費的冪等性來保證
舉個例子,當消費一條消息時就往數(shù)據(jù)庫插入一條數(shù)據(jù)。如何保證重復(fù)消費也插入一條數(shù)據(jù)呢?
那么我們就需要從冪等性角度考慮了。冪等性,我通俗點說,就一個數(shù)據(jù),或者一個請求,無論來多次,對應(yīng)的數(shù)據(jù)都不會改變的,不能出錯。
?
怎么保證消息隊列消費的冪等性?
我們需要結(jié)合業(yè)務(wù)來思考,比如下面的例子:
1.比如某個數(shù)據(jù)要寫庫,你先根據(jù)主鍵查一下,如果數(shù)據(jù)有了,就別插入了,update一下好吧
2.比如你是寫redis,那沒問題了,反正每次都是set,天然冪等性
3.對于消息,我們可以建個表(專門存儲消息消費記錄)
生產(chǎn)者,發(fā)送消息前判斷庫中是否有記錄(有記錄說明已發(fā)送),沒有記錄,先入庫,狀態(tài)為待消費,然后發(fā)送消息并把主鍵id帶上。
消費者,接收消息,通過主鍵ID查詢記錄表,判斷消息狀態(tài)是否已消費。若沒消費過,則處理消息,處理完后,更新消息記錄的狀態(tài)為已消費。
?
轉(zhuǎn)載于:https://www.cnblogs.com/756623607-zhang/p/10506909.html
總結(jié)
以上是生活随笔為你收集整理的【消息队列】kafka是如何保证消息不被重复消费的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AVL树平衡旋转详解
- 下一篇: HTML5 使用 JS 生成二维码,带头