分享方式:


服務匯流排交易處理概觀

本文討論 Microsoft Azure 服務匯流排的交易功能。 交易範例會說明大部分的討論。 本文只包含交易處理概觀以及服務匯流排中的「傳送方式」功能,而「不可部分完成交易」範例的範圍更廣且更複雜。

注意

  • 基本層的服務匯流排並不支援交易。 標準層和進階層支援交易。 如需這些階層之間的差異,請參閱服務匯流排定價
  • 不支援在交易中混合管理和傳訊作業。
  • JavaScript SDK 不支援交易。

服務匯流排中的交易

交易會將兩個以上的作業一起分組到「執行範圍」。 本質上,這類交易必須確定屬於指定作業群組的所有作業都一起成功或失敗。 在這部分,所有交易都會當成一個單位,通常稱為「不可部分完成性」

服務匯流排是交易訊息代理人,並確保其訊息存放區之所有內部作業的交易完整性。 服務匯流排中的所有訊息傳輸 (例如,將訊息移至無效信件佇列,或自動轉寄實體之間的訊息) 為交易式。 這麼一來,如果服務匯流排接受訊息,表示訊息已經儲存並標上序號。 從那時開始,服務匯流排內的任何訊息傳輸都是跨實體的協調作業,並且不會導致訊息遺失 (來源成功,但目標失敗) 或重複 (來源失敗,但目標成功)。

服務匯流排支援交易範圍內單一傳訊實體 (佇列、主題、訂用帳戶) 的分組作業。 例如,您可以將數個訊息傳送至交易範圍內的一個佇列;而且,在交易順利完成時,只會將訊息認可到佇列的記錄檔。

交易範圍內的作業

可在交易範圍內執行的作業如下︰

  • 傳送
  • 完成
  • 放棄
  • 無效信件
  • 延遲
  • 更新鎖定

不包括接收作業,因為假設應用程式使用 peek-lock 模式,在一些接收迴圈內或搭配回呼來取得訊息,然後只會開啟交易範圍來處理訊息。

訊息的處置 (完成、放棄、寄不出的信件、延遲) 接著發生於整體交易結果的範圍內,並與整體交易結果相依。

重要

當作業位於交易範圍時,如果發生例外狀況,Azure 服務匯流排不會重試作業。

未在交易範圍中登錄的作業

請注意,呼叫 Cosmos DB 等資料庫和其他服務的訊息處理程式碼不會自動將這些下游資源登錄到相同的交易範圍。 如需如何處理這些案例的詳細資訊,請參閱有關等冪訊息處理的指導方針

傳輸和「傳送方式」

若要啟用從佇列或主題到處理器再到另一個佇列或主題的交易式資料送交,服務匯流排支援「傳輸」。 在傳輸作業中,寄件者會先將訊息傳送至「傳輸佇列或主題」,而傳輸佇列或主題會使用自動轉寄功能所依賴的相同穩固傳輸實作,立即將訊息移至想要的目的地佇列或主題。 訊息絕不會認可到傳輸佇列或主題的記錄檔,如此,傳輸佇列或主題的取用者便可以看到該訊息。

傳輸佇列或主題本身是寄件者輸入訊息的來源時,就能知道這個交易式功能的能力。 換句話說,服務匯流排可以「透過」傳輸佇列或主題將訊息傳輸到目的地佇列或主題,同時對輸入訊息執行完整 (或延遲,或無效信件) 作業 (全部都在一個不可部分完成作業中)。

如果您需要從主題訂用帳戶接收,然後傳送至相同交易中的佇列或主題,傳輸實體必須是主題。 在此案例中,開始主題的交易範圍、從交易範圍內的訂用帳戶接收,然後透過傳輸主題傳送至佇列或主題目的地。

注意

  • 如果訊息是透過交易範圍中的傳輸佇列來傳送,則 TransactionPartitionKey 功能上等於 PartitionKey。 其會確保訊息在傳輸時保持在一起並依序排列。
  • 如果刪除了目的地佇列或主題,則會引發 404 例外狀況。

透過程式碼查看

若要設定這類傳輸,您可以建立將目標設為透過傳輸佇列之目的地佇列的訊息寄件者。 您也要有從相同佇列提取訊息的收件者。 例如:

簡單交易接著會使用這些元素,如下列範例所示。 若要參考完整範例,請參閱 GitHub 上的原始程式碼

var options = new ServiceBusClientOptions { EnableCrossEntityTransactions = true };
await using var client = new ServiceBusClient(connectionString, options);

ServiceBusReceiver receiverA = client.CreateReceiver("queueA");
ServiceBusSender senderB = client.CreateSender("queueB");

ServiceBusReceivedMessage receivedMessage = await receiverA.ReceiveMessageAsync();

using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
    await receiverA.CompleteMessageAsync(receivedMessage);
    await senderB.SendMessageAsync(new ServiceBusMessage());
    ts.Complete();
}

若要深入了解 EnableCrossEntityTransactions 屬性,請參閱下列參考 ServiceBusClientBuilder.enableCrossEntityTransactions 方法

Timeout

交易會在 2 分鐘後逾時。 交易計時器會在交易中的第一個作業啟動時啟動。

下一步

如需服務匯流排佇列的詳細資訊,請參閱下列文章: