GitHub - fencyio:為RabbitMQ消費者提供冪等性保證的庫包

banq發表於2019-05-28

fency是一個使用SpringBoot和Redis消除RabbitMQ中重複訊息的開源專案。
即使傳送方應用程式僅傳送一次訊息,接收方應用程式也可能不止一次地接收訊息。
冪等元一詞在數學中用於描述一個函式,如果它應用於自身,則產生相同的結果:f(x)= f(f(x))。在訊息處理中,這個概念轉換為:一條訊息無論是一次還是多次接收都會產生相同的效果。這意味著即使接收器接收到相同訊息的重複,傳送者也可以安全地重新傳送訊息而不會引起任何問題。
收件人可以透過跟蹤已收到的訊息來明確地刪除訊息。唯一的訊息識別符號ID可以簡化此任務,並有助於檢測具有相同訊息內容的兩個合法訊息到達的情況。
為了基於訊息識別符號檢測和消除重複訊息,訊息接收者必須保留已經接收的訊息識別符號的列表。

技術實施
為了儲存已處理的訊息後設資料,我們必須處於事務上下文中。如果出現問題,則必須回滾事務。

  1. MessageInterceptor建立的MessageContext在一個ThreadLocal,並將其儲存
  2. 所述IdempotencyBarrier是圍繞一個方面@IdempotentConsumer註釋。它檢索MessageContext並檢查訊息是否已存在。唯一訊息金鑰由messageId和consumerQueueName組成。

如果訊息不存在,則呼叫目標方法,並將訊息後設資料儲存在資料儲存中。
如果訊息已存在,則會記錄一條錯誤訊息,並且不會呼叫目標方法。

使用@IdempotentConsumer為您的消費者新增註釋。
請參閱示例應用程式:fency-spring-boot-sample-app
 

相關文章