我要描述的實質上是兩個不同系統之間的兩階段提交問題,我正在尋找如何處理它的建議。在我們的Web應用程序中,我們將一些昂貴的/第三方操作(例如發送電子郵件)轉移到帶外後臺工作進程(我們稱之爲我們的工作基礎結構)。兩階段提交 - 如何有效使用我的隊列?
要發送電子郵件,我們在數據庫中創建了一個電子郵件對象和電子郵件作業。然後,我們必須等待我們的工作監視器收取電子郵件作業併發送它。作業監視器基本上是在閒置時每隔幾秒輪詢一次數據庫。
但是,這會在電子郵件發送中添加一個延遲,並將添加的數據添加到數據庫的非法負載中。如果我們可以在電子郵件創建後立即將電子郵件作業放到隊列中,那將會更好。
但是,這目前失敗的原因有兩個。首先,隊列通常比網絡請求快得多。在Web請求提交數據庫事務之前,該電子郵件會被拾取以供處理,因此無法正確生成電子郵件。其次,如果Web請求失敗,它將回滾其數據庫事務,這意味着電子郵件應該發送而不是。但是,如果已經放入隊列中,則不再處於請求的控制之下。
在隊列和數據庫之間創建兩階段提交是否有很好的策略?作爲參考,我們使用RabbitMQ和MySQL與InnoDB表。我提出的一個想法是在數據庫事務提交後將電子郵件作業粘貼到隊列中,但這會使電子郵件從不會排隊。我仍然必須創建一個輪詢過程來監視應該發送但不發送的電子郵件。