Skicka meddelanden till ett Azure Service Bus-ämne och ta emot meddelanden från prenumerationer till ämnet (Python)
I den här självstudien gör du följande:
- Skapa ett Service Bus-namnområde med Azure Portal.
- Skapa ett Service Bus-ämne med Azure Portal.
- Skapa en Service Bus-prenumeration på ämnet med Azure Portal.
- Skriv ett Python-program för att använda azure-servicebus-paketet för att:
- Skicka en uppsättning meddelanden till ämnet.
- Ta emot dessa meddelanden från prenumerationen.
Kommentar
Den här snabbstarten innehåller stegvisa instruktioner för ett enkelt scenario med att skicka en batch meddelanden till ett Service Bus-ämne och ta emot dessa meddelanden från en prenumeration på ämnet. Du hittar färdiga Python-exempel för Azure Service Bus i Azure SDK för Python-lagringsplatsen på GitHub.
Förutsättningar
- En Azure-prenumeration.
- Python 3.8 eller senare
Kommentar
Den här självstudien fungerar med exempel som du kan kopiera och köra med Python. Anvisningar om hur du skapar ett Python-program finns i Skapa och distribuera ett Python-program till en Azure-webbplats. Mer information om hur du installerar paket som används i den här självstudien finns i Python-installationsguiden.
Skapa ett namnområde i Azure Portal
För att komma igång med Service Bus-meddelandeentiteter i Azure måste du först skapa ett namnområde med ett namn som är unikt i Azure. Ett namnområde tillhandahåller en omfångscontainer för Service Bus-resurser (köer, ämnen osv.) i ditt program.
Så här skapar du ett namnområde:
Logga in på Azure-portalen.
I det vänstra navigeringsfältet väljer du Integrering i listan över kategorier, hovra musen över Service Bus och välj + sedan knappen på Service Bus-panelen.
Följ dessa steg i taggen Grundläggande på sidan Skapa namnområde:
För Prenumeration väljer du en Azure-prenumeration där du ska skapa namnrymden.
För Resursgrupp väljer du en befintlig resursgrupp där namnrymden ska finnas, eller så skapar du en ny.
Ange ett namn för namnrymden. Namnområdesnamnet bör följa följande namngivningskonventioner:
- Namnet måste vara unikt i Hela Azure. Systemet kontrollerar omedelbart om namnet är tillgängligt.
- Namnlängden är minst 6 och högst 50 tecken.
- Namnet får endast innehålla bokstäver, siffror, bindestreck "-".
- Namnet måste börja med en bokstav och sluta med en bokstav eller siffra.
- Namnet slutar inte med "-sb" eller "-mgmt".
För Plats väljer du land eller region där namnrymden ska finnas.
För Prisnivå väljer du prisnivån (Basic, Standard eller Premium) för namnområdet. För den här snabbstarten väljer du Standard.
Viktigt!
Om du vill använda ämnen och prenumerationer väljer du antingen Standard eller Premium. Ämnen/prenumerationer stöds inte på prisnivån Basic.
Om du har valt prisnivån Premium anger du antalet meddelandeenheter. Premium-nivån ger resursisolering på processor- och minnesnivå så att varje arbetsbelastning körs självständigt. Den här resurscontainern kallas för en meddelandefunktionsenhet. Ett premiumnamnområde har minst en meddelandeenhet. Du kan välja 1, 2, 4, 8 eller 16 meddelandeenheter för varje Service Bus Premium-namnområde. Mer information finns i Service Bus Premium-meddelanden.
Välj Granska + skapa längst ned på sidan.
På sidan Granska + skapa granskar du inställningarna och väljer Skapa.
När distributionen av resursen har slutförts väljer du Gå till resurs på distributionssidan.
Startsidan för din Service Bus-namnrymd visas.
Skapa ett ämne med Azure Portal
På sidan Service Bus Namespace (Service Bus-namnrymd) väljer du Ämnen på den vänstra menyn.
Välj + Ämne i verktygsfältet.
Ange ett namn för ämnet. Lämna standardvärdena för de andra alternativen.
Välj Skapa.
Skapa en prenumeration på ämnet
Välj det ämne som du skapade i föregående avsnitt.
På sidan Service Bus-ämne väljer du + Prenumeration i verktygsfältet.
Följ dessa steg på sidan Skapa prenumeration :
Ange S1 som namn på prenumerationen.
Ange 3 för Maximalt antal leveranser.
Välj sedan Skapa för att skapa prenumerationen.
Autentisera appen till Azure
Den här snabbstarten visar två sätt att ansluta till Azure Service Bus: lösenordsfri och niska veze.
Det första alternativet visar hur du använder ditt säkerhetsobjekt i Microsoft Entra-ID och rollbaserad åtkomstkontroll (RBAC) för att ansluta till ett Service Bus-namnområde. Du behöver inte oroa dig för att ha hårdkodade niska veze i koden eller i en konfigurationsfil eller i ett säkert lagringsutrymme som Azure Key Vault.
Det andra alternativet visar hur du använder en niska veze för att ansluta till ett Service Bus-namnområde. Om du inte har använt Azure tidigare kan det vara enklare att följa niska veze alternativet. Vi rekommenderar att du använder det lösenordslösa alternativet i verkliga program och produktionsmiljöer. Mer information finns i Autentisering och auktorisering. Du kan också läsa mer om lösenordslös autentisering på översiktssidan.
Tilldela roller till din Microsoft Entra-användare
När du utvecklar lokalt kontrollerar du att användarkontot som ansluter till Azure Service Bus har rätt behörigheter. Du behöver rollen Azure Service Bus-dataägare för att kunna skicka och ta emot meddelanden. Om du vill tilldela dig själv den här rollen behöver du rollen Administratör för användaråtkomst eller en annan roll som innehåller åtgärden Microsoft.Authorization/roleAssignments/write
. Du kan tilldela Azure RBAC-roller till en användare med hjälp av Azure-portalen, Azure CLI eller Azure PowerShell. Läs mer om tillgängliga omfång för rolltilldelningar på översiktssidan för omfång .
I följande exempel tilldelas Azure Service Bus Data Owner
rollen till ditt användarkonto, vilket ger fullständig åtkomst till Azure Service Bus-resurser. I ett verkligt scenario följer du principen om lägsta behörighet för att ge användarna endast de minsta behörigheter som krävs för en säkrare produktionsmiljö.
Inbyggda Azure-roller för Azure Service Bus
För Azure Service Bus skyddas redan hanteringen av namnområden och alla relaterade resurser via Azure-portalen och Azure-resurshanterings-API:et med hjälp av Azure RBAC-modellen. Azure tillhandahåller de inbyggda Azure-rollerna nedan för att auktorisera åtkomst till ett Service Bus-namnområde:
- Azure Service Bus-dataägare: Ger dataåtkomst till Service Bus-namnområdet och dess entiteter (köer, ämnen, prenumerationer och filter). En medlem i den här rollen kan skicka och ta emot meddelanden från köer eller ämnen/prenumerationer.
- Azure Service Bus Data Sender: Använd den här rollen för att ge sändningsåtkomst till Service Bus-namnområdet och dess entiteter.
- Azure Service Bus-datamottagare: Använd den här rollen för att ge ta emot åtkomst till Service Bus-namnområdet och dess entiteter.
Om du vill skapa en anpassad roll läser du Rättigheter som krävs för Service Bus-åtgärder.
Lägga till Microsoft Entra-användare i rollen Som Azure Service Bus-ägare
Lägg till ditt Microsoft Entra-användarnamn i rollen Azure Service Bus-dataägare på Service Bus-namnområdesnivå. Det gör att en app som körs i kontexten för ditt användarkonto kan skicka meddelanden till en kö eller ett ämne och ta emot meddelanden från en kö eller ett ämnes prenumeration.
Viktigt!
I de flesta fall tar det en minut eller två innan rolltilldelningen sprids i Azure. I sällsynta fall kan det ta upp till åtta minuter. Om du får autentiseringsfel när du först kör koden väntar du en stund och försöker igen.
Om du inte har sidan Service Bus-namnområde öppen i Azure-portalen letar du upp Service Bus-namnområdet med hjälp av huvudsökfältet eller det vänstra navigeringsfältet.
På översiktssidan väljer du Åtkomstkontroll (IAM) på den vänstra menyn.
På sidan Åtkomstkontroll (IAM) väljer du fliken Rolltilldelningar .
Välj + Lägg till på den översta menyn och sedan Lägg till rolltilldelning från den resulterande nedrullningsbara menyn.
Använd sökrutan för att filtrera resultatet till önskad roll. I det här exemplet söker
Azure Service Bus Data Owner
du efter och väljer matchande resultat. Välj sedan Nästa.Under Tilldela åtkomst till väljer du Användare, grupp eller tjänstens huvudnamn och sedan + Välj medlemmar.
I dialogrutan söker du efter ditt Microsoft Entra-användarnamn (vanligtvis din user@domain e-postadress) och väljer sedan Välj längst ned i dialogrutan.
Välj Granska + tilldela för att gå till den sista sidan och sedan Granska + tilldela igen för att slutföra processen.
Kodkonfiguration
Följ den här snabbstarten med lösenordslös autentisering och ditt eget Azure-konto:
- Installera Azure CLI.
- Logga in med ditt Azure-konto i terminalen eller kommandotolken med
az login
. - Använd samma konto när du lägger till lämplig roll i resursen senare i självstudien.
- Kör självstudiekoden i samma terminal eller kommandotolk.
Viktigt!
Kontrollera att du loggar in med az login
. Klassen DefaultAzureCredential
i den lösenordslösa koden använder Azure CLI-autentiseringsuppgifterna för att autentisera med Microsoft Entra-ID.
Om du vill använda den lösenordslösa koden måste du ange en:
- fullständigt kvalificerat service bus-namnområde, till exempel: <service-bus-namespace.servicebus.windows.net>
- ämnesnamn
- prenumerationsnamn
Använda pip för att installera paket
Om du vill installera nödvändiga Python-paket för den här Service Bus-självstudien öppnar du en kommandotolk som har Python i sin sökväg. Ändra katalogen till den mapp där du vill ha dina exempel.
Installera paket:
pip install azure-servicebus pip install azure-identity pip install aiohttp
Skicka meddelanden till ett ämne
Följande exempelkod visar hur du skickar en batch med meddelanden till ett Service Bus-ämne. Mer information finns i kodkommentar.
Öppna din favoritredigerare, till exempel Visual Studio Code, skapa en fil send.py och lägg till följande kod i den.
Lägg till följande
import
-uttryck.import asyncio from azure.servicebus.aio import ServiceBusClient from azure.servicebus import ServiceBusMessage from azure.identity.aio import DefaultAzureCredential
Lägg till konstanterna och definiera en autentiseringsuppgift.
FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
Viktigt!
- Ersätt
FULLY_QUALIFIED_NAMESPACE
med det fullständigt kvalificerade namnområdet för Service Bus-namnområdet. - Ersätt
TOPIC_NAME
med namnet på ämnet.
I föregående kod använde du Azure Identity-klientbibliotekets
DefaultAzureCredential
klass. När appen körs lokalt under utvecklingenDefaultAzureCredential
identifierar och autentiserar den automatiskt till Azure med det konto som du loggade in på Azure CLI med. När appen distribueras till AzureDefaultAzureCredential
kan du autentisera din app till Microsoft Entra-ID via en hanterad identitet utan några kodändringar.- Ersätt
Lägg till en metod för att skicka ett enda meddelande.
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")
Avsändaren är ett objekt som fungerar som en klient för det ämne som du skapade. Du skapar den senare och skickar den som ett argument till den här funktionen.
Lägg till en metod för att skicka en lista med meddelanden.
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")
Lägg till en metod för att skicka en batch med meddelanden.
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")
Skapa en Service Bus-klient och sedan ett ämnessändarobjekt för att skicka meddelanden.
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("-----------------------")
Ta emot meddelanden från en prenumeration
Följande exempelkod visar hur du tar emot meddelanden från en prenumeration. Den här koden tar kontinuerligt emot nya meddelanden tills den inte tar emot några nya meddelanden på 5 (max_wait_time
) sekunder.
Öppna din favoritredigerare, till exempel Visual Studio Code, skapa en fil recv.py och lägg till följande kod i den.
Precis som i skicka-exemplet lägger du till
import
instruktioner, definierar konstanter som du bör ersätta med dina egna värden och definierar en autentiseringsuppgift.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()
Skapa en Service Bus-klient och sedan ett mottagarobjekt för prenumerationen för att ta emot meddelanden.
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()
run
Anropa metoden.asyncio.run(run())
Kör appen
Öppna en kommandotolk som har Python i sin sökväg och kör sedan koden för att skicka och ta emot meddelanden för en prenumeration under ett ämne.
python send.py; python recv.py
Du bör se följande utdata:
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
Gå till Service Bus-namnområdet i Azure-portalen. På sidan Översikt kontrollerar du att antalet inkommande och utgående meddelanden är 16. Om du inte ser antalet uppdaterar du sidan efter att ha väntat i några minuter.
Välj ämnet i det nedre fönstret för att se sidan Service Bus-ämne för ditt ämne. På den här sidan bör du se tre inkommande och tre utgående meddelanden i diagrammet Meddelanden .
Om du väljer en prenumeration på den här sidan kommer du till sidan Service Bus-prenumeration . Du kan se antalet aktiva meddelanden, antal meddelanden med obeställbara meddelanden med mera på den här sidan. I det här exemplet har alla meddelanden tagits emot, så antalet aktiva meddelanden är noll.
Om du kommenterar ut mottagningskoden visas antalet aktiva meddelanden som 16.
Nästa steg
Se följande dokumentation och exempel:
- Azure Service Bus-klientbibliotek för Python
- Exempel.
- Mappen sync_samples innehåller exempel som visar hur du interagerar med Service Bus på ett synkront sätt. I den här snabbstarten använde du den här metoden.
- Mappen async_samples innehåller exempel som visar hur du interagerar med Service Bus på ett asynkront sätt.
- referensdokumentation för azure-servicebus