閱讀425 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go jQuery中跳出$.each
  下一篇:go Android係統移植調試文章收集