RabbitMQ消費端冪等性概念及解決方案

2021-10-10 01:16:51 字數 1036 閱讀 8917

使用者對於同一操作發起的一次請求或者多次請求的結果是一致的。

比如資料庫的樂觀鎖,在執行更新操作前,先去資料庫查詢version,然後執行更新語句,以version作為條件,如果執行更新時有其他人先更新了這張表的資料,那麼這個條件就不生效了,也就不會執行操作了,通過這種樂觀鎖的機制來保障冪等性.

消費端實現冪等性,就意味著,我們的訊息永遠不會消費多次,即使我們收到了多條一樣的訊息。

在業務高峰期最容易產生訊息重複消費問題,當con消費完訊息時,在給pro返回ack時由於網路中斷,導致pro未收到確認資訊,該條訊息就會重新傳送並被con消費,但實際上該消費者已成功消費了該條訊息,這就造成了重複消費.

唯一id +指紋碼機制,利用db主鍵去重。

select

count(1

)from t_order

where id = 唯一id +指紋碼

小結

首先我們需要根據訊息生成乙個全域性唯一id,然後還需要加上乙個指紋碼。這個指紋碼它並不一定是系統去生成的,而是一些外部的規則或者內部的業務規則去拼接,它的目的就是為了保障這次操作是絕對唯一的。

將id + 指紋碼拼接好的值作為資料庫主鍵,就可以進行去重了。即在消費訊息前呢,先去資料庫查詢這條訊息的指紋碼標識是否存在,沒有就執行insert操作,如果有就代表已經被消費了,就不需要管了

需要考慮的問題:

這裡只提用redis的原子性去解決mq冪等性重複消費的問題

mq的冪等性問題 根本在於的是生產端未正常接收ack,可能是網路抖動、網路中斷導致

可能的方案

con在消費開始時將 id放入到redis的bitmap中,pro每次生產資料時,從redis的bitmap對應位置若不能取出id,則生產訊息傳送,否則不進行訊息傳送。

但是有人可能會說,萬一con,proredis命令執行失敗了怎麼辦,雖然又出現重複消費又出現redis非正常執行命令的可能性極低,但是萬一呢?

ok,我們可以在redis命令執行失敗時,將訊息落庫,每日用定時器,對這種極特殊的訊息進行處理。

十 RabbitMQ 冪等性

目錄使用者對於同一操作發起的一次請求或者多次請求的結果是一致的,不會因為多次點選而產生了 舉個最簡單的例子,那就是支付,使用者購買商品後支付,支付扣款成功,但是返回結果的時候網路異常,此時錢已經扣了,使用者再次點選按鈕,此時會進行第二次扣款,返回結果成功,使用者查詢餘額發現多扣錢了,流水記錄也變成了...

kafka消費訊息時的冪等性

1.什麼是kafka消費訊息時的冪等性 kafka消費訊息時的冪等性,簡而言之就是消費者對介面的多次呼叫所產生的結果和呼叫一次是是一致的,也就是說在kafka中有可能會消費到重複的資料,這個時候需要客戶端去處理這種情況,使得訊息消費一次和消費多次是一樣的結果。2.產生原因 資料流 生產者 生產者會往...

如何維護訊息消費的冪等性

冪等性 乙個請求,不管重複來多少次,結果是不會改變的。每個訊息都會有唯一的訊息 id。1 先查再儲存 每次儲存資料的時候,都先查一下,如果資料存在了那麼就不儲存。這個情況是併發不高的情況。2 業務表新增約束條件 如果你的資料庫將來都不會分庫分表,那麼可以在業務表字段加上唯一約束條件 unique 這...