Berichten verzenden naar een Azure Service Bus-onderwerp en berichten ontvangen van abonnementen op het onderwerp (Python)

In deze zelfstudie voert u de volgende stappen uit:

  1. Een Service Bus-naamruimte maken met de Azure-portal.
  2. Een Service Bus-onderwerp maken met de Azure-portal.
  3. Een Service Bus-abonnement maken met de Azure-portal.
  4. Schrijf een Python-toepassing om het azure-servicebus-pakket te gebruiken om het volgende te doen:
    • Een set berichten naar het onderwerp verzenden.
    • Deze berichten ontvangen van het abonnement.

Notitie

Deze quickstart bevat stapsgewijze instructies voor een eenvoudig scenario voor het verzenden van een batch berichten naar een Service Bus-onderwerp en het ontvangen van die berichten van een abonnement op het onderwerp. U vindt vooraf gebouwde Python-voorbeelden voor Azure Service Bus in de Azure SDK voor Python-opslagplaats op GitHub.

Vereisten

Notitie

Deze zelfstudie werkt met voorbeelden die u kunt kopiëren en uitvoeren met behulp van Python. Zie Een Python-toepassing maken en implementeren op een Azure-website voor instructies over het maken van een Python-toepassing. Zie de Installatiehandleiding voor Python voor meer informatie over het installeren van pakketten die in deze zelfstudie worden gebruikt.

Een naamruimte in de Azure-portal maken

Als u Service Bus-berichtenentiteiten wilt gebruiken in Azure, moet u eerst een naamruimte maken met een naam die uniek is binnen Azure. Een naamruimte biedt een bereikcontainer voor Service Bus-resources (wachtrijen, onderwerpen, enzovoort) in uw toepassing.

Ga als volgt te werk om een naamruimte te maken:

  1. Meld u aan bij het Azure-portaal.

  2. Navigeer naar de pagina Alle services.

  3. Selecteer integratie in de linkernavigatiebalk in de lijst met categorieën, beweeg de muisaanwijzer over Service Bus en selecteer + vervolgens de knop op de Service Bus-tegel.

    Image showing selection of Create a resource, Integration, and then Service Bus in the menu.

  4. Voer in de tag Basisinformatie van de pagina Naamruimte maken de volgende stappen uit:

    1. Kies voor Abonnement een Azure-abonnement waarin u de naamruimte maakt.

    2. Kies voor Resourcegroep een bestaande resourcegroep waarin de naamruimte moet worden opgenomen of maak een nieuwe resourcegroep.

    3. Voer een naam in voor de naamruimte. De naamruimtenaam moet voldoen aan de volgende naamconventies:

      • De naam moet uniek zijn in Azure. In het systeem wordt onmiddellijk gecontroleerd of de naam beschikbaar is.
      • De naamlengte is ten minste 6 en maximaal 50 tekens.
      • De naam mag alleen letters, cijfers, afbreekstreepjes "-" bevatten.
      • De naam moet beginnen met een letter en eindigen op een letter of cijfer.
      • De naam eindigt niet op '-sb' of '-mgmt'.
    4. Kies voor Locatie de regio waarin uw naamruimte moet worden gehost.

    5. Selecteer voor de prijscategorie de prijscategorie (Basic, Standard of Premium) voor de naamruimte. Voor deze quickstart selecteert u Standard.

      Belangrijk

      Kies Standard of Premium indien u gebruik wilt maken van onderwerpen en abonnementen. Onderwerpen/abonnementen worden niet ondersteund in de prijscategorie Basic.

      Als u de Prijscategorie Premium hebt geselecteerd, geeft u het aantal berichteneenheden op. De Premium-prijscategorie biedt isolatie van resources op het niveau van de CPU en het geheugen, zodat elke workload geïsoleerd wordt uitgevoerd. Deze resourcecontainer wordt een Messaging-eenheid genoemd. Een Premium-naamruimte heeft ten minste één Messaging-eenheid. U kunt 1, 2, 4, 8 of 16 berichteneenheden selecteren voor elke Service Bus Premium-naamruimte. Zie Service Bus Premium Messaging voor meer informatie.

    6. Selecteer Controleren en maken onderaan de pagina.

      Image showing the Create a namespace page

    7. Controleer de instellingen op de pagina Beoordelen en maken en selecteer Maken.

  5. Zodra de implementatie van de resource is geslaagd, selecteert u Ga naar de resource op de implementatiepagina.

    Image showing the deployment succeeded page with the Go to resource link.

  6. U ziet de startpagina voor uw Service Bus-naamruimte.

    Image showing the home page of the Service Bus namespace created.

Een onderwerp maken met de Azure-portal

  1. Selecteer in het linkermenu op de pagina Service Bus-naamruimte de optie Onderwerpen.

  2. Selecteer + Onderwerp op de werkbalk.

  3. Voer een naam in voor het onderwerp. Houd voor de overige opties de standaardwaarden aan.

  4. Selecteer Maken.

    Image showing the Create topic page.

Een abonnement op het onderwerp maken

  1. Selecteer het onderwerp dat u in de vorige sectie hebt gemaakt.

    Image showing the selection of topic from the list of topics.

  2. Selecteer + Abonnement op de werkbalk op de pagina Service Bus-onderwerp.

    Image showing the Add subscription button.

  3. Voer op de pagina Abonnement maken de volgende stappen uit:

    1. Voer S1 in als naam van het abonnement.

    2. Voer 3 in voor maximaal aantal bezorgingen.

    3. Selecteer vervolgens Maken om het abonnement te maken.

      Image showing the Create subscription page.

De app verifiëren bij Azure

In deze quickstart ziet u twee manieren om verbinding te maken met Azure Service Bus: zonder wachtwoord en verbindingsreeks.

De eerste optie laat zien hoe u uw beveiligingsprincipaal gebruikt in Microsoft Entra ID en op rollen gebaseerd toegangsbeheer (RBAC) om verbinding te maken met een Service Bus-naamruimte. U hoeft zich geen zorgen te maken over het in code vastgelegde verbindingsreeks in uw code of in een configuratiebestand of in een beveiligde opslag, zoals Azure Key Vault.

De tweede optie laat zien hoe u een verbindingsreeks gebruikt om verbinding te maken met een Service Bus-naamruimte. Als u nog niet eerder met Azure werkt, kunt u de verbindingsreeks optie gemakkelijker volgen. We raden u aan de optie zonder wachtwoord te gebruiken in echte toepassingen en productieomgevingen. Zie Verificatie en autorisatie voor meer informatie. U kunt ook meer lezen over verificatie zonder wachtwoord op de overzichtspagina.

Rollen toewijzen aan uw Microsoft Entra-gebruiker

Zorg er bij het lokaal ontwikkelen voor dat het gebruikersaccount dat verbinding maakt met Azure Service Bus over de juiste machtigingen beschikt. U hebt de rol Azure Service Bus-gegevenseigenaar nodig om berichten te kunnen verzenden en ontvangen. Als u uzelf deze rol wilt toewijzen, hebt u de rol Gebruikerstoegang Beheer istrator of een andere rol nodig die de Microsoft.Authorization/roleAssignments/write actie bevat. U kunt Azure RBAC-rollen toewijzen aan een gebruiker met behulp van Azure Portal, Azure CLI of Azure PowerShell. Meer informatie over de beschikbare bereiken voor roltoewijzingen op de overzichtspagina van het bereik.

In het volgende voorbeeld wordt de Azure Service Bus Data Owner rol toegewezen aan uw gebruikersaccount, dat volledige toegang biedt tot Azure Service Bus-resources. Volg in een echt scenario het principe van minimale bevoegdheden om gebruikers alleen de minimale machtigingen te geven die nodig zijn voor een veiligere productieomgeving.

Ingebouwde Azure-rollen voor Azure Service Bus

Voor Azure Service Bus is het beheer van naamruimten en alle gerelateerde resources via Azure Portal en de Azure Resource Management-API al beveiligd met behulp van het Azure RBAC-model. Azure biedt de onderstaande ingebouwde Azure-rollen voor het autoriseren van toegang tot een Service Bus-naamruimte:

  • Azure Service Bus-gegevenseigenaar: hiermee schakelt u gegevenstoegang tot de Service Bus-naamruimte en de bijbehorende entiteiten (wachtrijen, onderwerpen, abonnementen en filters) in. Een lid van deze rol kan berichten verzenden en ontvangen van wachtrijen of onderwerpen/abonnementen.
  • Azure Service Bus-gegevenszender: gebruik deze rol om de verzendtoegang tot de Service Bus-naamruimte en de bijbehorende entiteiten te geven.
  • Azure Service Bus-gegevensontvanger: gebruik deze rol om de ontvangsttoegang te geven tot de Service Bus-naamruimte en de bijbehorende entiteiten.

Als u een aangepaste rol wilt maken, raadpleegt u Rechten die vereist zijn voor Service Bus-bewerkingen.

Microsoft Entra-gebruiker toevoegen aan de rol Azure Service Bus-eigenaar

Voeg uw Microsoft Entra-gebruikersnaam toe aan de rol Azure Service Bus-gegevenseigenaar op het niveau van de Service Bus-naamruimte. Hiermee kan een app die wordt uitgevoerd in de context van uw gebruikersaccount berichten verzenden naar een wachtrij of een onderwerp en berichten ontvangen van een wachtrij of het abonnement van een onderwerp.

Belangrijk

In de meeste gevallen duurt het een paar minuten voordat de roltoewijzing is doorgegeven in Azure. In zeldzame gevallen kan het maximaal acht minuten duren. Als u verificatiefouten ontvangt wanneer u de code voor het eerst uitvoert, wacht u even en probeert u het opnieuw.

  1. Als u de pagina Service Bus-naamruimte niet hebt geopend in Azure Portal, zoekt u uw Service Bus-naamruimte met behulp van de hoofdzoekbalk of linkernavigatiebalk.

  2. Selecteer op de overzichtspagina toegangsbeheer (IAM) in het linkermenu.

  3. Selecteer op de pagina Toegangsbeheer (IAM) het tabblad Roltoewijzingen .

  4. Selecteer + Toevoegen in het bovenste menu en voeg vervolgens roltoewijzing toe in de resulterende vervolgkeuzelijst.

    A screenshot showing how to assign a role.

  5. Gebruik het zoekvak om de resultaten te filteren op de gewenste rol. In dit voorbeeld zoekt Azure Service Bus Data Owner en selecteert u het overeenkomende resultaat. Kies vervolgens Volgende.

  6. Selecteer onder Toegang toewijzen de optie Gebruiker, groep of service-principal en kies vervolgens + Leden selecteren.

  7. Zoek in het dialoogvenster naar uw Microsoft Entra-gebruikersnaam (meestal uw user@domain e-mailadres) en kies Vervolgens onderaan het dialoogvenster Selecteren .

  8. Selecteer Beoordelen + toewijzen om naar de laatste pagina te gaan en vervolgens opnieuw beoordelen en toewijzen om het proces te voltooien.

Code-instelling

Volg deze quickstart met behulp van verificatie zonder wachtwoord en uw eigen Azure-account:

  • Installeer de Azure CLI.
  • Meld u aan met uw Azure-account bij de terminal of opdrachtprompt met az login.
  • Gebruik hetzelfde account wanneer u de juiste rol toevoegt aan uw resource verderop in de zelfstudie.
  • Voer de zelfstudiecode uit in dezelfde terminal of opdrachtprompt.

Belangrijk

Zorg ervoor dat u zich aanmeldt met az login. De DefaultAzureCredential klasse in de code zonder wachtwoord maakt gebruik van de Azure CLI-referenties voor verificatie met Microsoft Entra-id.

Als u de code zonder wachtwoord wilt gebruiken, moet u een:

  • volledig gekwalificeerde Service Bus-naamruimte, bijvoorbeeld: <service-bus-naamruimte.servicebus.windows.net>
  • onderwerpnaam
  • Naam van het abonnement

Pip gebruiken om pakketten te installeren

  1. Als u de vereiste Python-pakketten voor deze Service Bus-zelfstudie wilt installeren, opent u een opdrachtprompt met Python in het pad. Wijzig de map in de map waarin u uw voorbeelden wilt hebben.

  2. Pakketten installeren:

    pip install azure-servicebus
    pip install azure-identity
    pip install aiohttp
    

Berichten verzenden naar een onderwerp

De volgende voorbeeldcode laat zien hoe u een batch berichten naar een Service Bus-onderwerp verzendt. Zie opmerkingen bij de code voor meer informatie.

Open uw favoriete editor, zoals Visual Studio Code, maak een bestand send.py en voeg de volgende code eraan toe.

  1. Voeg de volgende import-instructies toe.

    import asyncio
    from azure.servicebus.aio import ServiceBusClient
    from azure.servicebus import ServiceBusMessage
    from azure.identity.aio import DefaultAzureCredential
    
  2. Voeg de constanten toe en definieer een referentie.

    FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE"
    TOPIC_NAME = "TOPIC_NAME"
    
    credential = DefaultAzureCredential()
    

    Belangrijk

    • Vervang door FULLY_QUALIFIED_NAMESPACE de volledig gekwalificeerde naamruimte voor uw Service Bus-naamruimte.
    • Vervang TOPIC_NAME door de naam van het onderwerp.

    In de voorgaande code hebt u de klasse van DefaultAzureCredential de Azure Identity-clientbibliotheek gebruikt. Wanneer de app lokaal wordt uitgevoerd tijdens de ontwikkeling, DefaultAzureCredential wordt automatisch gedetecteerd en geverifieerd bij Azure met behulp van het account waarmee u bent aangemeld bij de Azure CLI. Wanneer de app wordt geïmplementeerd in Azure, DefaultAzureCredential kan uw app worden geverifieerd bij Microsoft Entra-id via een beheerde identiteit zonder dat er codewijzigingen zijn aangebracht.

  3. Voeg een methode voor het verzenden van één bericht toe.

    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")
    

    De afzender is een object dat fungeert als een client voor het onderwerp dat u hebt gemaakt. U maakt en verzendt deze later als een argument voor deze functie.

  4. Voeg een methode voor het verzenden van een lijst met berichten toe.

    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")
    
  5. Voeg een methode voor het verzenden van een batch met berichten toe.

    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")
    
  6. Maak een Service Bus-client en vervolgens een object voor de afzender van het onderwerp om berichten te verzenden.

    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("-----------------------")
    

Berichten van een abonnement ontvangen

In de volgende voorbeeldcode ziet u hoe u berichten van een abonnement ontvangt. Deze code ontvangt voortdurend nieuwe berichten totdat er geen nieuwe berichten meer worden ontvangen gedurende 5 seconden (max_wait_time).

Open uw favoriete editor, zoals Visual Studio Code, maak een bestand recv.py en voeg de volgende code eraan toe.

  1. Net als bij het verzendvoorbeeld voegt u instructies toe import , definieert u constanten die u door uw eigen waarden moet vervangen en definieert u een referentie.

    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()
    
  2. Maak een Service Bus-client en vervolgens een abonnementsontvangerobject om berichten te ontvangen.

    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()
    
  3. Roep de run methode aan.

    asyncio.run(run())
    

De app uitvoeren

Open een opdrachtprompt met Python in het pad en voer vervolgens de code uit om berichten voor een abonnement onder een onderwerp te verzenden en te ontvangen.

python send.py; python recv.py

U moet de volgende uitvoer zien:

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

Ga in Azure Portal naar uw Service Bus-naamruimte. Controleer op de pagina Overzicht of er 16 inkomende en uitgaande berichten zijn. Als u de tellingen niet ziet, wacht u een paar minuten en vernieuwt u de pagina.

Incoming and outgoing message count

Selecteer het onderwerp in het onderste deelvenster om de pagina Service Bus-onderwerp voor uw onderwerp weer te geven. Op deze pagina ziet u drie inkomende en drie uitgaande berichten in de grafiek Berichten.

Incoming and outgoing messages

Als u op deze pagina een abonnement selecteert, krijgt u toegang tot de pagina Service Bus-abonnement. Op deze pagina ziet u het aantal actieve berichten, het aantal onbestelbare berichten, en meer. In dit voorbeeld zijn alle berichten ontvangen, waardoor het aantal actieve berichten nul is.

Active message count

Als u commentaar maakt van de ontvangstcode, verandert het aantal actieve berichten in 16.

Active message count - no receive

Volgende stappen

Raadpleeg de volgende documentatie en voorbeelden: