Schreiben von Code zum Senden und Empfangen von Nachrichten mithilfe eines Themas

Abgeschlossen

In einer verteilten Anwendung müssen einige Nachrichten nur an eine einzige Empfängerkomponente gesendet werden. Andere Nachrichten sind für mehrere Ziele bestimmt.

Im Folgenden wird beschrieben, was passiert, wenn ein Benutzer eine Fahrradbestellung storniert. Die Stornierung einer Bestellung unterscheidet sich ein wenig von einer Erstbestellung. Wenn eine Bestellung aufgegeben wird, wartete der Workflow, bis die Zahlungsabwicklung für die Bestellung abgeschlossen war, bevor die Bestellung an die Filiale gesendet wird. Beim Stornierungsvorgang benachrichtigen Sie gleichzeitig die Filiale und den Zahlungsabwickler. Dieser Ansatz minimiert das Risiko, dass der Auslieferungsfahrer Zeit verschwendet.

Sie werden ein Azure Service Bus-Thema verwenden, um zu ermöglichen, dass mehrere Komponenten die gleiche Nachricht erhalten. Als Nächstes sehen Sie sich den Prozess und die Überlegungen beim Schreiben des Codes an.

Code mit Themen und Code mit Warteschlangen im Vergleich

Wenn Sie möchten, dass jede gesendete Nachricht an alle abonnierenden Komponenten geliefert wird, verwenden Sie Themen. Das Schreiben von Code, der Themen verwendet, ist eine Möglichkeit, Warteschlangen zu ersetzen. Sie werden das gleiche NuGet-Paket namens Azure.Messaging.ServiceBus verwenden, Verbindungszeichenfolgen konfigurieren und asynchrone Programmiermuster verwenden.

Sie verwenden auch die gleichen ServiceBusClient- und ServiceBusSender-Klassen, um Nachrichten zu senden, und die ServiceBusProcessor-Klasse, um Nachrichten zu empfangen.

Festlegen von Filtern für Abonnements

Wenn Sie möchten, dass bestimmte Nachrichten, die an das Thema gesendet werden, einem bestimmten Abonnement zugestellt werden, können Sie für das Abonnement im Thema einen oder mehrere Filter festlegen. In der Fahrradanwendung werden beispielsweise in den Filialen UWP-Anwendungen (Universelle Windows-Plattform) ausgeführt. Jede Filiale kann das Thema abonnieren OrderCancellation und nach seiner eigenen StoreId filtern. Sie sparen Internetbandbreite, da keine unnötigen Nachrichten an mehrere Filialen gesendet werden. In der Zwischenzeit abonniert die Zahlungsabwicklungskomponente alle OrderCancellation-Nachrichten.

Drei Arten von Filtern sind möglich:

  • Boolesche Filter: Mit TrueFilter wird sichergestellt, dass alle an das Thema gesendeten Nachrichten dem aktuellen Abonnement zugestellt werden. Mit FalseFilter wird sichergestellt, dass keine der Nachrichten dem aktuellen Abonnement zugestellt wird. (Effektiv blockiert dies das Abonnement bzw. deaktiviert es.)
  • SQL-Filter: Mit einem SQL-Filter wird eine Bedingung angegeben, indem die gleiche Syntax wie in einer WHERE-Klausel in einer SQL-Abfrage verwendet wird. Nur Nachrichten, für die beim Auswerten dieses Filters True zurückgegeben wird, werden den Abonnenten zugestellt.
  • Korrelationsfilter: Ein Korrelationsfilter enthält Bedingungen, die mit den Eigenschaften jeder Nachricht abgeglichen werden. Wenn die Eigenschaft im Filter und die in der Nachricht den gleichen Wert haben, wird dies als Übereinstimmung betrachtet.

Für Ihren StoreId-Filter können Sie auch einen SQL-Filter verwenden. SQL-Filter sind am flexibelsten, aber auch am rechenintensivsten, sodass der Filter den Service Bus-Durchsatz verlangsamen kann. In diesem Fall wählen Sie einen Korrelationsfilter.

Senden einer Nachricht an ein Thema

Um eine Nachricht an ein Thema zu senden, führen Sie die folgenden Schritte aus.

Fügen Sie in allen Sende- oder Empfangskomponenten allen Codedateien, in denen ein Service Bus-Thema aufgerufen wird, die folgenden using-Anweisungen hinzu.

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

Erstellen Sie zum Senden einer Nachricht zunächst ein neues ServiceBusClient-Objekt, und übergeben Sie diesem die Verbindungszeichenfolge und den Namen des Themas.

await using var client = new ServiceBusClient(connectionString);

Dann erstellen Sie ein ServiceBusSender-Objekt, indem Sie die CreateSender-Methode für das ServiceBusClient-Objekt aufrufen und den Namen des Themas angeben.

ServiceBusSender sender = client.CreateSender(topicName);

Sie können eine Nachricht an das Thema senden, indem Sie die ServiceBusSender.SendMessageAsync()-Methode aufrufen und eine ServiceBusMessage übergeben. Wie bei Warteschlangen muss die Nachricht als UTF-8-Zeichenfolge gesendet werden.

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

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

Empfangen von Nachrichten aus einem Abonnement

Um Nachrichten aus einem Abonnement zu empfangen, müssen Sie ein ServiceBusProcessor-Objekt erstellen und ihm den Themennamen und den Abonnementnamen übergeben.

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

Registrieren Sie dann einen Meldungshandler und einen Fehlerhandler.

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

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

Führen Sie Ihre Verarbeitungsarbeiten innerhalb des Meldungshandlers durch, und rufen Sie dann die ProcessMessageEventArgs.CompleteMessageAsync()-Methode auf, um die Nachricht aus dem Abonnement zu entfernen.

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