redis隊(duì)列實(shí)現(xiàn)高并發(fā) JAVA面試如何保證消息不被重復(fù)消費(fèi)?如何保證消息消費(fèi)的冪等性?
JAVA面試如何保證消息不被重復(fù)消費(fèi)?如何保證消息消費(fèi)的冪等性?我沒事,來這里玩,開始在各種網(wǎng)絡(luò)上尋找技術(shù)信息,之后以“頭條”為主。從尋找信息到交朋友。因?yàn)槲矣X得事情落后于時代,有人認(rèn)為,是因?yàn)樽约核?/p>
JAVA面試如何保證消息不被重復(fù)消費(fèi)?如何保證消息消費(fèi)的冪等性?
我沒事,來這里玩,開始在各種網(wǎng)絡(luò)上尋找技術(shù)信息,之后以“頭條”為主。從尋找信息到交朋友。因?yàn)槲矣X得事情落后于時代,有人認(rèn)為,是因?yàn)樽约核讲桓摺V皇窃谛睦锵?,無法實(shí)現(xiàn)現(xiàn)實(shí)
做程序員最慘莫過于出BUG,如何保證消息不被重復(fù)消費(fèi)?
為了保證消息只被消費(fèi)一次,我們可以依賴消息中間件的事務(wù)和精確的once機(jī)制。
當(dāng)然,它也可以從消費(fèi)端實(shí)現(xiàn),以確保消費(fèi)處理的冪等性。一個簡單的想法是為每條消息設(shè)置一個唯一的鍵,比如UUID。消費(fèi)者讀取消息后,會將密鑰放入redis隊(duì)列。在消費(fèi)時,它會首先確定redis隊(duì)列中是否有唯一的密鑰來決定是否執(zhí)行。實(shí)踐中經(jīng)常使用redis的setnx方法。
消息隊(duì)列,如何保證消息不被重復(fù)消費(fèi)?
現(xiàn)在消息機(jī)制一般是通過中間件實(shí)現(xiàn)的,如Kafka、ActiveMQ等。一般來說,有兩種消費(fèi)策略:至少一次和最多一次。
首先,至少一次。在這種情況下,使用消息很重要,不能容忍丟失。使用者從中間件集群中提取消息,在內(nèi)部消費(fèi),并將消費(fèi)結(jié)果通知集群。如果用戶計(jì)算機(jī)重新啟動或網(wǎng)絡(luò)丟失數(shù)據(jù)包,此時將提取重復(fù)的消息。一般的解決方案是保證對使用者業(yè)務(wù)邏輯進(jìn)行冪等處理。
第二,至少再來一次。此時,消息可能會丟失,并且不會重復(fù)消費(fèi)。
作為接收器,保持接口冪等是一項(xiàng)基本功能。它可以處理一些意外情況,例如集群失敗,或者需要跟蹤消息數(shù)據(jù)的歷史以便重新處理等。