正確答案: 啟用會話的 Azure Service Bus topic (sessionId=OrderId);為每個下游服務建立訂閱;使用 Service Bus 事務在同一個事務中完成傳入訊息並發送兩個傳出訊息;依賴訂閱上的無效信件子佇列來處理毒藥訊息。.
為什麼這是答案
此設計滿足所有要求。Azure Service Bus 的會話功能(使用 OrderId 作為 sessionId)確保了訊息的順序處理。每個下游服務的訂閱允許扇出傳遞。Service Bus 事務保證了傳入訊息的完成和兩個傳出命令的原子性,確保了「如果處理失敗則回溯」的需求。自動的無效信件子佇列機制有效隔離了毒藥訊息而不會遺失。
其他選項不符合所有要求:
不帶會話的 Azure Service Bus queue 無法保證訊息順序。
Azure Storage Queue 不支援事務,且其毒藥訊息處理機制較為手動。
Azure Event Grid topic 不保證訊息順序,且其事件排序和傳遞機制與此情境不符。
不帶會話的 Azure Service Bus topic 無法保證 OrderId 的順序處理。