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