Senden von Nachrichten an ein Azure Service Bus-Thema und Empfangen von Nachrichten von Abonnements für das Thema (Python)
In diesem Tutorial führen Sie folgende Schritte aus:
- Erstellen eines Service Bus-Namespace mithilfe des Azure-Portals
- Erstellen eines Service Bus-Themas mithilfe des Azure-Portals
- Erstellen eines Service Bus-Abonnements für dieses Thema mit dem Azure-Portal
- Schreiben Sie eine Python-Anwendung, um das Paket azure-servicebus für Folgendes zu verwenden:
- Senden einer Reihe von Nachrichten an das Thema
- Empfangen dieser Nachrichten aus dem Abonnement
Hinweis
In dieser Schnellstartanleitung wird Schritt für Schritt ein einfaches Szenario erläutert, bei dem Sie einen Batch von Nachrichten an ein Service Bus-Thema senden und diese Nachrichten von einem Abonnement des Themas empfangen werden. Weitere vordefinierte Python-Beispiele für Azure Service Bus finden Sie auf GitHub im Repository mit dem Azure SDK für Python.
Voraussetzungen
- Ein Azure-Abonnement.
- Python 3.8 oder höher
Hinweis
Dieses Tutorial funktioniert für die Beispiele, die Sie mit Python kopieren und ausführen können. Anweisungen zum Erstellen einer Python-Anwendung finden Sie unter Schnellstart: Bereitstellen einer Python-Web-App (Django oder Flask) in Azure App Service. Weitere Informationen zum Installieren der in diesem Tutorial verwendeten Pakete finden Sie im Python-Installationshandbuch.
Erstellen eines Namespace im Azure-Portal
Um mit der Verwendung von Service Bus-Nachrichtenentitäten in Azure beginnen zu können, müssen Sie zuerst einen Namespace mit einem in Azure eindeutigen Namen erstellen. Ein Namespace ist ein Bereichscontainer für Service Bus-Ressourcen (Warteschlangen, Themen usw.) innerhalb Ihrer Anwendung.
So erstellen Sie einen Namespace
Melden Sie sich beim Azure-Portal an.
Navigieren Sie zur Seite Alle Dienste.
Wählen Sie im linken Navigationsbereich in der Kategorienliste Integration aus, zeigen Sie mit dem Mauszeiger auf Service Bus, und wählen Sie auf der Service Bus-Kachel die Schaltfläche + aus.
Führen Sie auf der Seite Namespace erstellen auf der Registerkarte Grundlagen die folgenden Schritte aus:
Wählen Sie unter Abonnement ein Azure-Abonnement aus, in dem der Namespace erstellt werden soll.
Wählen Sie für Ressourcengruppe eine vorhandene Ressourcengruppe aus, oder erstellen Sie eine neue.
Geben Sie einen Namen für den Namespace ein. Der Namespacename sollte den folgenden Namenskonventionen entsprechen:
- Der Name muss innerhalb von Azure eindeutig sein. Das System überprüft sofort, ob dieser Name verfügbar ist.
- Die Länge des Namens beträgt mindestens 6 und maximal 50 Zeichen.
- Der Name darf nur Buchstaben, Zahlen, Bindestriche
-
enthalten. - Der Name muss mit einem Buchstaben beginnen und mit einem Buchstaben oder einer Ziffer enden.
- Der Name endet nicht mit
-sb
oder-mgmt
.
Wählen Sie unter Standort die Region aus, in der Ihr Namespace gehostet werden soll.
Wählen Sie unter Tarif den Tarif (Basic, Standard oder Premium) für den Namespace aus. Wählen Sie für diesen Schnellstart die Option Standard aus.
Wenn Sie den Premium-Tarif auswählen, wählen Sie aus, ob Sie Georeplikation für den Namespace aktivieren können. Das Georeplikationsfeature stellt sicher, dass die Metadaten und Daten eines Namespaces kontinuierlich aus einer primären Region in eine oder mehrere sekundäre Regionen repliziert werden.
Wichtig
Wenn Sie Themen und Abonnements nutzen möchten, wählen Sie entweder Standard oder Premium aus. Themen/Abonnements werden für den Basic-Tarif nicht unterstützt.
Wenn Sie den Tarif Premium auswählen, geben Sie die Anzahl von Messagingeinheiten an. Der Premium-Tarif bietet Ressourcenisolierung auf CPU- und Arbeitsspeicherebene, sodass die einzelnen Workloads voneinander isoliert ausgeführt werden. Dieser Ressourcencontainer wird als Messagingeinheit bezeichnet. Ein Premium-Namespace verfügt über mindestens eine Messagingeinheit. Sie können 1, 2, 4, 8 oder 16 Messagingeinheiten für jeden Service Bus Premium-Namespace auswählen. Weitere Informationen finden Sie unter Service Bus Premium- und Standard-Preisstufe für Messaging.
Wählen Sie am unteren Rand der Seite die Option Bewerten + erstellen aus.
Überprüfen Sie die Einstellungen auf der Seite Überprüfen und erstellen, und wählen Sie Erstellen aus.
Wählen Sie nach der erfolgreichen Bereitstellung der Ressource auf der Bereitstellungsseite Zur Ressource wechseln aus.
Die Startseite für Ihren Service Bus-Namespace wird angezeigt.
Erstellen eines Themas mit dem Azure-Portal
Erweitern Sie auf der Seite Service Bus-Namespace die Option Entitäten im Navigationsmenü nach links, und wählen Sie die Option Themen im linken Menü aus.
Wählen Sie auf der Symbolleiste die Option + Thema aus.
Geben Sie unter Name einen Namen für das Thema ein. Behalten Sie bei den anderen Optionen die Standardwerte bei.
Klicken Sie auf Erstellen.
Erstellen eines Abonnements für das Thema
Wählen Sie das Thema aus, das Sie im vorherigen Abschnitt erstellt haben.
Wählen Sie auf der Seite Service Bus-Thema auf der Symbolleiste die Option + Abonnement aus.
Führen Sie auf der Seite Abonnement erstellen die folgenden Schritte aus:
Geben Sie S1 für Name des Abonnements ein.
Geben Sie 3 für Maximale Lieferungsanzahl ein.
Wählen Sie dann Erstellen, um das Abonnement zu erstellen.
Authentifizieren der App bei Azure
In dieser Schnellstartanleitung werden zwei Möglichkeiten zum Herstellen einer Verbindung mit Azure Service Bus gezeigt: kennwortlos und Verbindungszeichenfolge.
Die erste Option zeigt, wie Sie über Ihren Sicherheitsprinzipal in Microsoft Entra ID und die rollenbasierte Zugriffssteuerung (Role-Based Access Control, RBAC) eine Verbindung mit einem Service Bus-Namespace herstellen. Sie müssen sich keine Gedanken darüber machen, dass hartcodierte Verbindungszeichenfolgen in Ihrem Code oder in einer Konfigurationsdatei oder in einem sicheren Speicher wie Azure Key Vault vorhanden sind.
Die zweite Option zeigt, wie Sie mithilfe einer Verbindungszeichenfolge eine Verbindung mit einem Service Bus-Namespace herstellen. Wenn Sie noch nicht mit Azure vertraut sind, ist die Option mit der Verbindungszeichenfolge möglicherweise einfacher. In realen Anwendungen und Produktionsumgebungen wird die kennwortlose Option empfohlen. Weitere Informationen finden Sie unter Authentifizierung und Autorisierung. Weitere Informationen zur kennwortlosen Authentifizierung finden Sie auch auf der Übersichtsseite.
Zuweisen von Rollen zu Ihrem Microsoft Entra-Benutzer
Achten Sie bei der lokalen Entwicklung darauf, dass das Benutzerkonto, das die Verbindung mit Azure Service Bus herstellt, über die korrekten Berechtigungen verfügt. Zum Senden und Empfangen von Nachrichten ist die Rolle Azure Service Bus-Datenbesitzer erforderlich. Um sich selbst diese Rolle zuweisen zu können, benötigen Sie die Rolle „Benutzerzugriffsadministrator“ oder eine andere Rolle, die die Aktion Microsoft.Authorization/roleAssignments/write
umfasst. Sie können einem Benutzer Azure RBAC-Rollen über das Azure-Portal, die Azure CLI oder mit Azure PowerShell zuweisen. Weitere Informationen zu den verfügbaren Bereichen für Rollenzuweisungen finden Sie auf der Seite Grundlegendes zum Bereich von Azure RBAC.
Im folgenden Beispiel wird Ihrem Benutzerkonto die Rolle Azure Service Bus Data Owner
zugewiesen. Diese Rolle bietet Vollzugriff auf Azure Service Bus-Ressourcen. Halten Sie sich in einem echten Szenario an das Prinzip der geringsten Rechte, um Benutzern nur die benötigten Mindestberechtigungen zu erteilen und so die Produktionsumgebung besser zu schützen.
Integrierte Azure-Rollen für Azure Service Bus
Bei Azure Service Bus ist die Verwaltung der Namespaces und aller zugehörigen Ressourcen über das Azure-Portal und die Azure-Ressourcenverwaltungs-API bereits durch das Azure RBAC-Modell geschützt. Azure stellt die folgenden integrierten Azure-Rollen zum Autorisieren des Zugriffs auf einen Service Bus-Namespace bereit:
- Azure Service Bus-Datenbesitzer: ermöglicht den Datenzugriff auf einen Service Bus-Namespace und seine Entitäten (Warteschlangen, Themen, Abonnements und Filter). Ein Mitglied dieser Rolle kann Nachrichten an Warteschlangen oder Themen/Abonnements senden bzw. aus diesen empfangen.
- Azure Service Bus-Datensender: Verwenden Sie diese Rolle, um dem Service Bus-Namespace und seinen Entitäten Sendezugriff zu erteilen.
- Azure Service Bus-Datenempfänger: Verwenden Sie diese Rolle, um Zugriff auf den Service Bus-Namespace und seine Entitäten zu erhalten.
Informationen zum Erstellen einer benutzerdefinierten Rolle finden Sie unter Erforderliche Rechte für Service Bus-Vorgänge.
Hinzufügen eines Microsoft Entra-Benutzers zur Azure Service Bus-Besitzerrolle
Fügen Sie auf Service Bus-Namespace-Ebene Ihren Microsoft Entra-Benutzernamen der Rolle Azure Service Bus-Datenbesitzer hinzu. Dies ermöglicht einer App, die im Kontext Ihres Benutzerkontos ausgeführt wird, Nachrichten an eine Warteschlange oder ein Thema zu senden und Nachrichten aus einer Warteschlange oder einem Abonnement eines Themas zu empfangen.
Wichtig
In der Regel dauert die Verteilung der Rollenzuweisung in Azure ein bis zwei Minuten. In seltenen Fällen kann sie aber bis zu acht Minuten dauern. Wenn bei der ersten Ausführung Ihres Codes Authentifizierungsfehler auftreten, warten Sie einige Momente, und versuchen Sie es dann erneut.
Wenn die Seite „Service Bus-Namespace“ im Azure-Portal nicht geöffnet ist, ermitteln Sie Ihren Service Bus-Namespace über die Hauptsuchleiste oder den linken Navigationsbereich.
Wählen Sie auf der Übersichtsseite im linken Menü die Option Zugriffssteuerung (IAM) aus.
Wählen Sie auf der Seite Zugriffssteuerung (IAM) die Registerkarte Rollenzuweisungen aus.
Wählen Sie im oberen Menü + Hinzufügen und aus dem dann angezeigten Dropdownmenü die Option Rollenzuweisung hinzufügen aus.
Über das Suchfeld können Sie die Ergebnisse für die gewünschte Rolle filtern. Suchen Sie in diesem Beispiel nach
Azure Service Bus Data Owner
, und wählen Sie das entsprechende Ergebnis aus. Klicken Sie dann auf Weiter.Wählen Sie unter Zugriff zuweisen zu die Option Benutzer, Gruppe oder Dienstprinzipal und dann die Option + Mitglieder auswählen aus.
Suchen Sie im Dialogfeld nach Ihrem Microsoft Entra-Benutzernamen (normalerweise Ihre E-Mail-Adresse benutzer@domäne), und wählen Sie unten im Dialogfeld Auswählen aus.
Wählen Sie Überprüfen und zuweisen aus, um zur letzten Seite zu gelangen, und wählen Sie erneut Überprüfen und zuweisen aus, um den Vorgang abzuschließen.
Codeeinrichtung
Gehen Sie wie folgt vor, um diese Schnellstartanleitung mit kennwortloser Authentifizierung und Ihrem eigenen Azure-Konto nachzuvollziehen:
- Installieren Sie die Azure CLI.
- Melden Sie sich mit Ihrem Azure-Konto beim Terminal oder an der Eingabeaufforderung mit
az login
an. - Verwenden Sie das gleiche Konto, wenn Sie Ihrer Ressource später in diesem Tutorial die entsprechende Rolle hinzufügen.
- Führen Sie den Tutorialcode im gleichen Terminal oder an der gleichen Eingabeaufforderung aus.
Wichtig
Stellen Sie sicher, dass Sie sich mit az login
anmelden. Die DefaultAzureCredential
-Klasse im kennwortlosen Code verwendet die Azure CLI-Anmeldeinformationen, um sich bei Microsoft Entra ID zu authentifizieren.
Um den kennwortlosen Code zu verwenden, müssen Sie Folgendes angeben:
- Den vollqualifizierten Namen für Ihren Service Bus-Namespace, z. B. <service-bus-namespace>.servicebus.windows.net
- Den Themennamen
- subscription name
Installieren von Paketen mithilfe von pip
Um die erforderlichen Python-Pakete für dieses Service Bus-Tutorial zu installieren, öffnen Sie eine Eingabeaufforderung, die Python im Pfad enthält. Ändern Sie das Verzeichnis in den Ordner, in dem Sie Ihre Beispiele speichern möchten.
Installieren der Pakete:
pip install azure-servicebus pip install azure-identity pip install aiohttp
Senden von Nachrichten an ein Thema
Mit dem folgenden Beispielcode wird veranschaulicht, wie Sie einen Batch mit Nachrichten an ein Service Bus-Thema senden. Weitere Einzelheiten finden Sie in den Codekommentaren.
Öffnen Sie Ihren bevorzugten Editor, z. B. Visual Studio Code, erstellen Sie eine Datei vom Typ send.py, und fügen Sie den folgenden Code ein.
Fügen Sie die folgenden
import
-Anweisungen hinzu:import asyncio from azure.servicebus.aio import ServiceBusClient from azure.servicebus import ServiceBusMessage from azure.identity.aio import DefaultAzureCredential
Fügen Sie die Konstanten hinzu, und definieren Sie Anmeldeinformationen.
FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
Wichtig
- Ersetzen Sie
FULLY_QUALIFIED_NAMESPACE
durch den vollqualifizierten Namespace für Ihren Service Bus-Namespace. - Ersetzen Sie
TOPIC_NAME
durch den Namen des Themas.
Im vorherigen Code haben Sie die
DefaultAzureCredential
-Klasse der Azure Identity-Clientbibliothek verwendet. Wenn die App während der Entwicklung lokal ausgeführt wird, führtDefaultAzureCredential
die Ermittlung automatisch aus und authentifiziert sich bei Azure mithilfe des Kontos, mit dem Sie sich bei der Azure CLI angemeldet haben. Wenn die App in Azure bereitgestellt wird, kannDefaultAzureCredential
Ihre App ohne Codeänderungen über eine verwaltete Identität bei Microsoft Entra authentifizieren.- Ersetzen Sie
Fügen Sie eine Methode zum Senden einer einzelnen Nachricht hinzu:
async def send_single_message(sender): # Create a Service Bus message message = ServiceBusMessage("Single Message") # send the message to the topic await sender.send_messages(message) print("Sent a single message")
Der Absender ist ein Objekt, das als Client für das von Ihnen erstellte Thema fungiert. Es wird später erstellt und als Argument an diese Funktion gesendet.
Fügen Sie eine Methode zum Senden einer Liste mit Nachrichten hinzu.
async def send_a_list_of_messages(sender): # Create a list of messages messages = [ServiceBusMessage("Message in list") for _ in range(5)] # send the list of messages to the topic await sender.send_messages(messages) print("Sent a list of 5 messages")
Fügen Sie eine Methode zum Senden eines Batchs mit Nachrichten hinzu.
async def send_batch_message(sender): # Create a batch of messages async with sender: batch_message = await sender.create_message_batch() for _ in range(10): try: # Add a message to the batch batch_message.add_message(ServiceBusMessage("Message inside a ServiceBusMessageBatch")) except ValueError: # ServiceBusMessageBatch object reaches max_size. # New ServiceBusMessageBatch object can be created here to send more data. break # Send the batch of messages to the topic await sender.send_messages(batch_message) print("Sent a batch of 10 messages")
Erstellen Sie einen Service Bus-Client und dann ein Absenderobjekt für das Thema, um Nachrichten senden zu können.
async def run(): # create a Service Bus client using the credential. async with ServiceBusClient( fully_qualified_namespace=FULLY_QUALIFIED_NAMESPACE, credential=credential, logging_enable=True) as servicebus_client: # Get a Topic Sender object to send messages to the topic sender = servicebus_client.get_topic_sender(topic_name=TOPIC_NAME) async with sender: # Send one message await send_single_message(sender) # Send a list of messages await send_a_list_of_messages(sender) # Send a batch of messages await send_batch_message(sender) # Close credential when no longer needed. await credential.close() asyncio.run(run()) print("Done sending messages") print("-----------------------")
Empfangen von Nachrichten aus einem Abonnement
Im folgenden Beispielcode wird das Empfangen von Nachrichten aus einem Abonnement gezeigt. Mit diesem Code werden fortlaufend neue Nachrichten empfangen, bis fünf Sekunden lang (max_wait_time
) keine neuen Nachrichten mehr empfangen werden.
Öffnen Sie Ihren bevorzugten Editor, z. B. Visual Studio Code, erstellen Sie eine Datei vom Typ recv.py, und fügen Sie den folgenden Code ein.
Fügen Sie ähnlich wie beim Beispiel zum Senden
import
-Anweisungen hinzu, definieren Sie Konstanten, die Sie durch Ihre eigenen Werte ersetzen müssen, und legen Sie Anmeldeinformationen fest.import asyncio from azure.servicebus.aio import ServiceBusClient from azure.identity.aio import DefaultAzureCredential FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" SUBSCRIPTION_NAME = "SUBSCRIPTION_NAME" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
Erstellen Sie einen Service Bus-Client und dann ein Empfängerobjekt für das Abonnement, um Nachrichten empfangen zu können.
async def run(): # create a Service Bus client using the credential async with ServiceBusClient( fully_qualified_namespace=FULLY_QUALIFIED_NAMESPACE, credential=credential, logging_enable=True) as servicebus_client: async with servicebus_client: # get the Subscription Receiver object for the subscription receiver = servicebus_client.get_subscription_receiver(topic_name=TOPIC_NAME, subscription_name=SUBSCRIPTION_NAME, max_wait_time=5) async with receiver: received_msgs = await receiver.receive_messages(max_wait_time=5, max_message_count=20) for msg in received_msgs: print("Received: " + str(msg)) # complete the message so that the message is removed from the subscription await receiver.complete_message(msg) # Close credential when no longer needed. await credential.close()
Rufen Sie die
run
-Methode auf.asyncio.run(run())
Ausführen der App
Öffnen Sie eine Eingabeaufforderung, die „Python“ im Pfad enthält, und führen Sie dann den Code aus, um Nachrichten für ein Abonnement unter einem Thema zu senden und zu empfangen.
python send.py; python recv.py
Die folgende Ausgabe wird angezeigt.
Sent a single message
Sent a list of 5 messages
Sent a batch of 10 messages
Done sending messages
-----------------------
Received: Single Message
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message in list
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Received: Message inside a ServiceBusMessageBatch
Navigieren Sie im Azure-Portal zu Ihrem Service Bus-Namespace. Vergewissern Sie sich auf der Seite Übersicht, dass die Anzahl für die eingehenden und ausgehenden Nachrichten „16“ beträgt. Falls diese Zahlen nicht angezeigt werden, sollten Sie die Seite nach einigen Minuten aktualisieren.
Wählen Sie im unteren Bereich das Thema aus, um die Seite Service Bus-Thema für Ihr Thema anzuzeigen. Auf dieser Seite sollten im Diagramm Nachrichten drei ein- und drei ausgehende Nachrichten angezeigt werden.
Wenn Sie auf dieser Seite ein Abonnement auswählen, gelangen Sie zur Seite Service Bus-Abonnement. Auf dieser Seite werden die Anzahl aktiver Nachrichten, die Anzahl unzustellbarer Nachrichten und weitere Informationen angezeigt. In diesem Beispiel wurden alle Nachrichten empfangen, sodass die Anzahl aktiver Nachrichten „0“ ist.
Wenn Sie den Code für den Empfang auskommentieren, wird „16“ als Anzahl aktiver Nachrichten angezeigt.
Nächste Schritte
Weitere Informationen finden Sie in der folgenden Dokumentation bzw. unter den folgenden Beispielen:
- Azure Service Bus-Clientbibliothek für Python
- Beispiele:
- Der Ordner sync_samples enthält Beispiele zur synchronen Interaktion mit Service Bus. In dieser Schnellstartanleitung haben Sie diese Methode verwendet.
- Der Ordner async_samples enthält Beispiele zur asynchronen Interaktion mit Service Bus.
- azure-servicebus: Referenzdokumentation