Pisanie kodu służącego do wysyłania i odbierania komunikatów przy użyciu tematu

Ukończone

W aplikacji rozproszonej niektóre komunikaty muszą zostać przesłane do jednego składnika odbiorcy. Inne komunikaty muszą dotrzeć do więcej niż jednego miejsca docelowego.

Zastanów się, co się stanie, gdy użytkownik anuluje zamówienie na rower. Anulowanie zamówienia różni się nieco od składania zamówienia początkowego. Po złożeniu zamówienia przepływ pracy czekał na wyczyszczenie zamówienia przetwarzania płatności przed wysłaniem zamówienia do lokalnego sklepu. W przypadku operacji anulowania powiadomisz witrynę sklepu i podmiot przetwarzający płatności w tym samym czasie. Takie podejście minimalizuje ryzyko marnowania czasu dostawy.

Aby umożliwić odbieranie tego samego komunikatu przez wiele składników, użyjesz tematu usługi Azure Service Bus. Następnie zapoznasz się z procesem i zagadnieniami dotyczącymi pisania kodu.

Porównanie kodu z tematami z kodem z kolejkami

Jeśli chcesz, aby każda wiadomość wysłana została dostarczona do wszystkich subskrybowanych składników, użyj tematów. Pisanie kodu, który korzysta z tematów, to sposób na zastąpienie kolejek. Użyjesz tego samego pakietu NuGet Azure.Messaging.ServiceBus, skonfigurujesz parametry połączenia i użyjesz wzorców programowania asynchronicznego.

Użyjesz również tej samej ServiceBusClient klasy i ServiceBusSender klas, aby wysyłać komunikaty i klasę do odbierania ServiceBusProcessor komunikatów.

Ustawianie filtrów w subskrypcjach

Jeśli chcesz, aby określone komunikaty wysyłane do tematu były dostarczane do określonej subskrypcji, możesz umieścić co najmniej jeden filtr w subskrypcji w temacie. Na przykład w aplikacji rowerowej sklepy działają platforma uniwersalna systemu Windows (UWP). Każdy sklep może subskrybować temat i filtrować OrderCancellation własny StoreIdelement . Oszczędzasz przepustowość internetu, ponieważ nie wysyłasz niepotrzebnych komunikatów do wielu lokalizacji magazynu. Tymczasem składnik przetwarzania płatności subskrybuje wszystkie OrderCancellation komunikaty.

Filtry można podzielić na trzy kategorie:

  • Filtry logiczne: Zapewnia TrueFilter , że wszystkie komunikaty wysyłane do tematu są dostarczane do bieżącej subskrypcji. FalseFilter zapewnia, że żadne komunikaty nie zostaną dostarczone do bieżącej subskrypcji. (Powoduje to zablokowanie lub wyłączenie subskrypcji).
  • Filtry SQL: filtr SQL określa warunek przy użyciu tej samej składni co klauzula WHERE w zapytaniu SQL. Do subskrybentów są dostarczane tylko komunikaty zwracane True po ocenie tego filtru.
  • Filtry korelacji: filtr korelacji zawiera zestaw warunków, które są dopasowane do właściwości każdego komunikatu. Jeśli właściwość w filtrze i właściwości komunikatu ma tę samą wartość, jest traktowana jako dopasowanie.

W przypadku filtru StoreId można użyć filtru SQL. Filtry SQL są najbardziej elastyczne, ale są również najbardziej kosztowne obliczenia, a filtr może spowolnić przepływność usługi Service Bus. W tym przypadku należy wybrać filtr korelacji.

Aby wysłać wiadomość do tematu

Aby wysłać wiadomość do tematu, wykonaj następujące kroki.

W każdym składniku wysyłającym lub odbieranym dodaj następujące using instrukcje do dowolnego pliku kodu, który wywołuje temat usługi Service Bus.

using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;

Aby wysłać komunikat, zacznij od utworzenia nowego ServiceBusClient obiektu i przekazania go parametry połączenia i nazwy tematu.

await using var client = new ServiceBusClient(connectionString);

Następnie utwórz obiekt, wywołując CreateSender metodę ServiceBusSender w ServiceBusClient obiekcie i określając nazwę tematu.

ServiceBusSender sender = client.CreateSender(topicName);

Możesz wysłać komunikat do tematu, wywołując ServiceBusSender.SendMessageAsync() metodę i przekazując element ServiceBusMessage. Podobnie jak w kolejce, komunikat musi być w postaci zakodowanego ciągu UTF-8.

string message = "Cancel! I have changed my mind!";
var message = new ServiceBusMessage(message);

// Send the message to the topic.
await sender.SendMessageAsync(message);

Aby odbierać komunikaty z subskrypcji

Aby otrzymać komunikat z subskrypcji, musisz utworzyć obiekt i przekazać ServiceBusProcessor mu nazwę tematu i nazwę subskrypcji.

processor = client.CreateProcessor(topicName, subscriptionName, options);

Następnie zarejestruj procedurę obsługi komunikatów i program obsługi błędów.

// Specify the handler method for messages.
processor.ProcessMessageAsync += MessageHandler;

// Specify the handler method for errors.
processor.ProcessErrorAsync += ErrorHandler;

Wykonaj operację przetwarzania w programie obsługi komunikatów, a następnie wywołaj ProcessMessageEventArgs.CompleteMessageAsync() metodę , aby usunąć komunikat z subskrypcji.

// Complete the message. The message is deleted from the subscription. 
await args.CompleteMessageAsync(args.Message);