冪等消費模式 - Pradeep Loganathan

banq發表於2019-07-26

事件驅動架構是一個分散式系統,而分散式系統是天生網路不可靠。這需要在發生故障時計劃進行重試,但是重試會導致重複記錄,某人帳戶中支付兩次付款是不可原諒的。
為了避免多次處理事件,我們需要應用Exactly-once語義。如果訊息處理系統和訊息消費者之間沒有某種合作,就不可能保證完全一次處理。如果訊息系統有對訊息釋出者釋出訊息的確認機制,,那麼每個訊息必須具有唯一ID以供訊息系統進行重複資料刪除。在消費者這邊也可以實現,重複資料刪除可用於確保不處理重複訊息。消費邏輯需是冪等的。
本質上,冪等意味著當多次接收到相同的事件/訊息時,對於接收者的狀態沒有變化。以下是一些方法:
  • 透過按身份標識ID重複訊息來重複傳入訊息。
  • 設計狀態切換來表示訊息的接受,以便在每次收到相同訊息時產生相同影響。
  • 收到重複訊息允許狀態切換產生無害影響。

冪等消費者模式就像一個有狀態過濾器,它允許由它包裝的邏輯只執行一次。實現這個需要兩個元素:
  • 一種透過業務鍵唯一標識key每條訊息的方法。
  • 冪等儲存庫。冪等儲存庫是一組持久Key的容器,它們將在消費者重新啟動後繼續存在,並且可以在資料庫表,日記帳或類似工具中實現。

當事件到達時,消費者需要使用分配給事件的事件key來唯一地識別它。檢查冪等儲存庫以檢視它是否包含key,如果不包含,則執行由其包裝的邏輯,否則將跳過該邏輯。
許多訊息傳遞系統,例如Apache ActiveMQ,Apache Kafka,Apache Camel都具有消除重複訊息的功能。Idempotent消費者模式用於在這些系統中提供這種功能。


 

相關文章