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