Udostępnij za pośrednictwem


Omówienie przetwarzania transakcji usługi Service Bus

W tym artykule omówiono możliwości transakcji usługi Microsoft Azure Service Bus. Większość dyskusji jest zilustrowana przez przykład transakcji. Ten artykuł jest ograniczony do przeglądu przetwarzania transakcji i wysyłania za pośrednictwem funkcji w usłudze Service Bus, podczas gdy przykład niepodzielnych transakcji jest szerszy i bardziej złożony w zakresie.

Uwaga

  • Warstwa podstawowa usługi Service Bus nie obsługuje transakcji. Warstwy Standardowa i Premium obsługują transakcje. Aby uzyskać różnice między tymi warstwami, zobacz Cennik usługi Service Bus.
  • Mieszanie operacji zarządzania i obsługi komunikatów w transakcji nie jest obsługiwane.
  • Zestaw SDK języka JavaScript nie obsługuje transakcji.

Transakcje w usłudze Service Bus

Transakcja grupuje ze sobą co najmniej dwie operacje w zakresie wykonywania. Z natury taka transakcja musi zapewnić, że wszystkie operacje należące do danej grupy operacji kończą się powodzeniem lub niepowodzeniem wspólnie. W tym zakresie transakcje działają jako jedna jednostka, która jest często określana jako niepodzielność.

Usługa Service Bus jest transakcyjnym brokerem komunikatów i zapewnia integralność transakcyjną dla wszystkich operacji wewnętrznych względem magazynów komunikatów. Wszystkie transfery komunikatów w usłudze Service Bus, takie jak przenoszenie komunikatów do kolejki utraconych komunikatów lub automatyczne przekazywanie komunikatów między jednostkami, są transakcyjne. W związku z tym, jeśli usługa Service Bus akceptuje komunikat, została już zapisana i oznaczona etykietą z numerem sekwencji. Od tego czasu wszelkie transfery komunikatów w usłudze Service Bus są koordynowanymi operacjami między jednostkami i nie spowodują utraty (powodzenie źródła i cel zakończy się niepowodzeniem) lub zduplikowaniu (niepowodzenie źródła i powodzenie elementu docelowego) komunikatu.

Usługa Service Bus obsługuje grupowanie operacji względem jednej jednostki obsługi komunikatów (kolejki, tematu, subskrypcji) w zakresie transakcji. Na przykład można wysłać kilka komunikatów do jednej kolejki z zakresu transakcji, a komunikaty będą zatwierdzane tylko w dzienniku kolejki po pomyślnym zakończeniu transakcji.

Operacje w zakresie transakcji

Operacje, które można wykonać w zakresie transakcji, są następujące:

  • Wysyłanie
  • Ukończ
  • Abandon
  • Deadletter
  • Odroczyć
  • Odnów blokadę

Operacje odbierania nie są uwzględniane, ponieważ zakłada się, że aplikacja uzyskuje komunikaty przy użyciu trybu podglądu blokady wewnątrz pętli odbierania lub wywołania zwrotnego, a dopiero potem otwiera zakres transakcji na potrzeby przetwarzania komunikatu.

Dyspozycja wiadomości (kompletna, porzucenie, utracony, odroczenie) następuje w zakresie i zależy od ogólnego wyniku transakcji.

Ważne

Usługa Azure Service Bus nie ponawia próby wykonania operacji w przypadku wyjątku, gdy operacja znajduje się w zakresie transakcji.

Operacje, które nie są objęte zakresami transakcji

Należy pamiętać, że kod przetwarzania komunikatów, który wywołuje bazy danych i inne usługi, takie jak Cosmos DB, nie automatycznie umieszcza tych zasobów podrzędnych w tym samym zakresie transakcyjnym. Aby uzyskać więcej informacji na temat obsługi tych scenariuszy, zapoznaj się z wytycznymi dotyczącymi idempotentnego przetwarzania komunikatów.

Transfery i "wyślij za pośrednictwem"

Aby włączyć transakcyjne przekazywanie danych z kolejki lub tematu do procesora, a następnie do innej kolejki lub tematu, usługa Service Bus obsługuje transfery. W operacji transferu nadawca najpierw wysyła komunikat do kolejki lub tematu transferu, a kolejka transferu lub temat natychmiast przenosi komunikat do zamierzonej kolejki docelowej lub tematu przy użyciu tej samej niezawodnej implementacji transferu, na którą opiera się funkcja automatycznego przeforowania. Komunikat nigdy nie jest zatwierdzany w dzienniku kolejki transferu lub tematu, tak aby stał się widoczny dla użytkowników kolejki transferu lub tematu.

Moc tej możliwości transakcyjnej staje się widoczna, gdy sama kolejka transferu lub temat jest źródłem komunikatów wejściowych nadawcy. Innymi słowy usługa Service Bus może przenieść komunikat do kolejki docelowej lub tematu "za pośrednictwem" kolejki transferu lub tematu, podczas wykonywania pełnej (lub odroczenia lub utraconych komunikatów) operacji na komunikacie wejściowym, wszystkie w jednej operacji niepodzielnej.

Jeśli musisz odebrać z subskrypcji tematu, a następnie wysłać do kolejki lub tematu w tej samej transakcji, jednostka transferu musi być tematem. W tym scenariuszu uruchom zakres transakcji w temacie, odbierz od subskrypcji z zakresem transakcji i wyślij za pośrednictwem tematu przeniesienia do kolejki lub miejsca docelowego tematu.

Uwaga

  • Jeśli komunikat jest wysyłany za pośrednictwem kolejki transferu w zakresie transakcji, TransactionPartitionKey funkcjonalnie odpowiada PartitionKey. Gwarantuje to, że komunikaty są przechowywane razem i w kolejności, w miarę ich przesyłania.
  • Jeśli kolejka docelowa lub temat zostanie usunięty, zostanie zgłoszony wyjątek 404.

Zobacz go w kodzie

Aby skonfigurować takie transfery, należy utworzyć nadawcę komunikatów, który jest przeznaczony dla kolejki docelowej za pośrednictwem kolejki transferu. Masz również odbiornik, który ściąga komunikaty z tej samej kolejki. Na przykład:

Prosta transakcja używa następnie tych elementów, jak w poniższym przykładzie. Aby zapoznać się z pełnym przykładem, zapoznaj się z kodem źródłowym w witrynie 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();
}

Aby dowiedzieć się więcej na temat właściwości, zobacz następującą EnableCrossEntityTransactions dokumentację : ServiceBusClientBuilder.enableCrossEntityTransactions Method (Metoda ServiceBusClientBuilder.enableCrossEntityTransactions).

Timeout

Limit czasu transakcji upływa po 2 minutach. Czasomierz transakcji rozpoczyna się po uruchomieniu pierwszej operacji w transakcji.

Następne kroki

Aby uzyskać więcej informacji na temat kolejek usługi Service Bus, zobacz następujące artykuły: