Обзор обработки транзакций в служебной шине

Эта статья описывает возможности служебной шины Microsoft Azure по работе с транзакциями. Большая часть обсуждения иллюстрируется примером "Транзакции". Эта статья рассматривает лишь обработку транзакций и функцию отправить через в служебной шине, но пример атомарных транзакций образец гораздо масштабнее и сложнее.

Примечание.

  • Ценовая категория "Базовый" Служебной шины Azure не поддерживает транзакции, а категории "Стандартный" и "Премиум" поддерживают. Различия между этими ценовыми категориями приведены на странице цен на Служебную шину.
  • Сочетание операций управления и обмена сообщениями в транзакции не поддерживается.
  • Пакет SDK javaScript не поддерживает транзакции.

Транзакции в служебной шине

Транзакция объединяет две или более операций в область выполнения. По своей природе такая транзакция должна обеспечивать либо успешное, либо неудачное выполнение всех относящихся к данной группе операций. В этом отношении транзакция выступает в качестве единого целого, что часто называется атомарностью.

Служебная шина является брокером для транзакционных сообщений и гарантирует целостность всех внутренних операций в соответствии с хранилищами сообщений. Все передачи сообщений в Служебной шине Azure, например перемещение сообщений в очередь недоставленных сообщений или автоматическая пересылка сообщений между сущностями, являются транзакционными. Таким образом, когда служебная шина принимает сообщение, оно уже сохранено и помечено порядковым номером. Начиная с этого момента любые передачи сообщений в служебной шине, являются скоординированными операциями между сущностями и не приведут ни к потере (успех исходной части, сбой целевой части), ни к дублированию (сбой исходной части, успех целевой части) сообщения.

Служебная шина поддерживает операции группирования относительно одной сущности обмена сообщениями (очереди, раздела, подписки) в области транзакции. Например, можно отправить несколько сообщений в одну очередь из области транзакций, и сообщение будет зафиксировано в журнале очереди только после успешного завершения транзакции.

Операции в области транзакций

Далее приведены операции, которые могут выполняться в области транзакций.

  • Отправить
  • Завершено
  • Отказаться
  • пометить как невостребованное;
  • отложить;
  • продлить блокировку.

Сюда не включены операции получения, так как предполагается, что приложение получает сообщения с помощью режима блокировки просмотра, внутри некоторого цикла получения или с помощью обратного вызова и только затем открывает область транзакций для обработки сообщения.

Обработка сообщения (выполнено, прервано, отложено, не доставлено) происходит в пределах области и зависит от общего результата транзакции.

Важно!

Служебная шина Azure не выполняет операцию повторно в случае возникновения исключения, если операция находится в области транзакции.

Операции, которые не выполняются в область транзакций

Помните, что код обработки сообщений, который вызывает базы данных и другие службы, такие как Cosmos DB, не автоматически заверяет эти подчиненные ресурсы в те же транзакционные область. Дополнительные сведения об обработке этих сценариев см. в рекомендациях по обработке идемпотентных сообщений.

Передачи и функция "отправить через"

Чтобы обеспечить транзакционное перемещение данных из очереди или раздела в обработчик, а затем в другую очередь или раздел, служебная шина поддерживает передачи. В операции передачи отправитель сначала отправляет сообщение в очередь или раздел передачи, который сразу же перемещает его в назначенную очередь или раздел, используя ту же надежную реализацию передачи, на которую полагается функция автоматической пересылки. Сообщение никогда не фиксируется в очереди передачи или журнале раздела таким образом, что оно становится видимым для потребителей очереди передачи или раздела.

Эффективность этой возможности становится очевидной, когда сама очередь или раздел передачи является источником для входных сообщений отправителя. Другими словами, служебная шина может передавать сообщения в очередь или раздел назначения "через" очередь или раздел передачи, при этом делая входное сообщение завершенным (либо отложенным или недоставленным) в рамках одной атомарной операции.

Если необходимо получить из подписки раздела, а затем отправить в очередь или раздел в той же транзакции, то объект передачи должен быть разделом. В этом сценарии запустите область транзакций в разделе, получите из подписки в пределах области действия транзакции и отправьте его через раздел передачи в очередь или назначение раздела.

Примечание.

Если сообщение отправляется через очередь передачи в область транзакции, TransactionPartitionKey функционально эквивалентноPartitionKey. Это гарантирует, что сообщения хранятся вместе и в порядке их передачи.

Пример кода

Для настройки таких передач вы создаете отправитель сообщений, сориентированный на очередь назначения через очередь передачи. Также есть получатель, который извлекает сообщения из той же очереди. Например:

Тогда простая транзакция использует эти элементы, как показано в следующем примере. Чтобы ознакомиться с полным примером, обратитесь к исходному коду на 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 Method.

Время ожидания

Время ожидания транзакции истекает через 2 минуты. Таймер транзакции запускается после начала первой операции в транзакции.

Следующие шаги

Дополнительные сведения об очередях служебной шины см. в следующих статьях: