Pisanie kodu służącego do wysyłania i odbierania komunikatów przy użyciu tematu
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 StoreId
element . 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 zwracaneTrue
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);