MOM係列文章之 - Final Consistency 討論
消息中間件的最終一致性如何保證?架構上麵,主要考慮以下幾個方麵:
1。事務同步;
2。消息緩存or持久化;
3。定時鍾輪詢
事務同步很好理解。我的消息總不能在事務提交前發出去吧?為此,架構設計中我們通常這麼幹:
public boolean publish(AsyncEvent event) { boolean result = true; //1.delegate task to TransactionSynchronizationManager's afterCompletion method if (TransactionSynchronizationManager.isSynchronizationActive()) { TransactionSynchronizationManager .registerSynchronization(new MQTransactionSynchronization(event, eventSender)); } else { //2. just do it by manual processing logger.info("Publish event: {}", event); result = eventSender.send(event); } return result; }
消息緩存or持久化,這裏有兩個進行實際處理的時機。其一,事務提交後,緩存或者數據庫中持有一份事件,這個也比較契合EDA架構;第二個持久化的時機可以放到消息發送失敗的時候。通常情況下,需要綜合考慮DeliveryMode,AUTO_ACKNOWLEDGE等參數的設置。
定時鍾輪詢,這一步也是MOM高可用性的一大保障。一旦我們緩存或者持久化消息後,當消息消費端出現問題,異或其它原因導致消費阻塞,我們就可以通過定時鍾輪詢+重推機製確保消息的最終一致性。
最後更新:2017-04-02 22:16:29