Inviare messaggi a un argomento del bus di servizio di Azure e ricevere messaggi dalle sottoscrizioni dell'argomento (Python)
In questa esercitazione si completa la procedura seguente:
- Creare uno spazio dei nomi del bus di servizio usando il portale di Azure.
- Creare un argomento del bus di servizio usando il portale di Azure.
- Creare una sottoscrizione a tale argomento del bus di servizio usando il portale di Azure.
- Scrivere un'applicazione Python per usare il pacchetto azure-servicebus per:
- Inviare un set di messaggi all'argomento.
- Ricevere tali messaggi dalla sottoscrizione.
Nota
Questa guida introduttiva fornisce istruzioni dettagliate per un semplice scenario di invio di un batch di messaggi a un argomento bus di servizio e la ricezione di tali messaggi da una sottoscrizione dell'argomento. È possibile trovare esempi python predefiniti per bus di servizio di Azure nel repository Azure SDK per Python in GitHub.
Prerequisiti
- Una sottoscrizione di Azure.
- Python 3.8 o versione successiva
Nota
Questa esercitazione funziona con esempi che è possibile copiare ed eseguire usando Python. Per istruzioni su come creare un'applicazione Python, vedere Creare e distribuire un'applicazione Python in un sito Web di Azure. Per altre informazioni sull'installazione di pacchetti usati in questa esercitazione, vedere la Guida all'installazione di Python.
Creare uno spazio dei nomi nel portale di Azure
Per iniziare a usare le entità di messaggistica del bus di servizio in Azure, prima di tutto è necessario creare uno spazio dei nomi con un nome univoco in Azure. Uno spazio dei nomi fornisce un contenitore di ambito per bus di servizio risorse (code, argomenti e così via) all'interno dell'applicazione.
Per creare uno spazio dei nomi:
Accedere al portale di Azure.
Passare alla pagina Tutti i servizi.
Sulla barra di spostamento a sinistra selezionare Integrazione nell'elenco delle categorie, passare il puntatore del mouse su bus di servizio e quindi selezionare + il pulsante nel riquadro bus di servizio.
Nel tag Informazioni di base della pagina Crea spazio dei nomi seguire questa procedura:
Per Sottoscrizione scegliere una sottoscrizione di Azure in cui creare lo spazio dei nomi.
Per Gruppo di risorse scegliere un gruppo di risorse esistente in cui risiederà lo spazio dei nomi oppure crearne uno nuovo.
Immettere un nome per lo spazio dei nomi. Il nome dello spazio dei nomi deve rispettare le convenzioni di denominazione seguenti:
- Il nome deve essere univoco in Azure. Verrà effettuato immediatamente un controllo sulla disponibilità del nome.
- La lunghezza del nome è almeno 6 e al massimo 50 caratteri.
- Il nome può contenere solo lettere, numeri, trattini "-".
- Il nome deve iniziare con una lettera e terminare con una lettera o un numero.
- Il nome non termina con "-sb" o "-mgmt".
Per Localitàscegliere l'area in cui deve essere ospitato lo spazio dei nomi.
Per Piano tariffario selezionare il piano tariffario (Basic, Standard o Premium) per lo spazio dei nomi. Per questa guida introduttiva selezionare Standard.
Importante
Se si vogliono usare argomenti e sottoscrizioni, scegliere Standard o Premium. Gli argomenti e le sottoscrizioni non sono supportati nel piano tariffario Basic.
Se è stato selezionato il piano tariffario Premium, specificare il numero di unità di messaggistica. Il piano Premium fornisce l'isolamento delle risorse a livello di CPU e memoria in modo che ogni carico di lavoro venga eseguito in isolamento. Questo contenitore di risorse viene chiamato unità di messaggistica. Uno spazio dei nomi Premium ha almeno un'unità di messaggistica. È possibile selezionare 1, 2, 4, 8 o 16 unità di messaggistica per ogni spazio dei nomi bus di servizio Premium. Per altre informazioni, vedere Messaggistica Premium del bus di servizio.
Selezionare Rivedi e crea nella parte inferiore della pagina.
Nella pagina Rivedi e crea rivedere le impostazioni e selezionare Crea.
Al termine della distribuzione della risorsa, selezionare Vai alla risorsa nella pagina di distribuzione.
Viene visualizzata la home page dello spazio dei nomi del bus di servizio.
Creare un argomento usando il portale di Azure
Nella pagina Spazio dei nomi del bus di servizio scegliere Argomenti dal menu a sinistra.
Selezionare + Argomento sulla barra degli strumenti.
Immettere un nome per l'argomento. Lasciare invariati i valori predefiniti delle altre opzioni.
Seleziona Crea.
Creare una sottoscrizione all'argomento
Selezionare l'argomento creato nella sezione precedente.
Nella pagina argomento bus di servizio selezionare + Sottoscrizione sulla barra degli strumenti.
Nella pagina Crea sottoscrizione seguire questa procedura:
Immettere S1 per nome della sottoscrizione.
Immettere 3 per Numero massimo di recapito.
Selezionare quindi Crea per creare la sottoscrizione.
Autenticare l'app in Azure
Questa guida introduttiva illustra due modi per connettersi a bus di servizio di Azure: senza password e stringa di connessione.
La prima opzione mostra come usare l'entità di sicurezza in Microsoft Entra ID e il controllo degli accessi in base al ruolo per connettersi a uno spazio dei nomi bus di servizio. Non è necessario preoccuparsi di avere stringa di connessione hardcoded nel codice o in un file di configurazione o in un'archiviazione sicura come Azure Key Vault.
La seconda opzione mostra come usare un stringa di connessione per connettersi a uno spazio dei nomi bus di servizio. Se non si ha esperienza con Azure, è possibile trovare l'opzione stringa di connessione più semplice da seguire. È consigliabile usare l'opzione senza password in applicazioni e ambienti di produzione reali. Per altre informazioni, consultare Autenticazione e autorizzazione. Per altre informazioni sull'autenticazione senza password, vedere la pagina di panoramica.
Assegnare ruoli all'utente di Microsoft Entra
Quando si sviluppa in locale, assicurarsi che l'account utente che si connette a bus di servizio di Azure disponga delle autorizzazioni corrette. Per inviare e ricevere messaggi, è necessario il ruolo di proprietario dei dati bus di servizio di Azure. Per assegnare a se stessi questo ruolo, è necessario il ruolo Accesso utente Amministrazione istrator o un altro ruolo che include l'azioneMicrosoft.Authorization/roleAssignments/write
. È possibile assegnare ruoli controllo degli accessi in base al ruolo di Azure a un utente usando il portale di Azure, l'interfaccia della riga di comando di Azure o Azure PowerShell. Altre informazioni sugli ambiti disponibili per le assegnazioni di ruolo nella pagina di panoramica dell'ambito.
L'esempio seguente assegna il Azure Service Bus Data Owner
ruolo all'account utente, che fornisce l'accesso completo alle risorse di bus di servizio di Azure. In uno scenario reale, seguire il principio dei privilegi minimi per concedere agli utenti solo le autorizzazioni minime necessarie per un ambiente di produzione più sicuro.
Ruoli predefiniti di Azure per bus di servizio di Azure
Per bus di servizio di Azure, la gestione degli spazi dei nomi e di tutte le risorse correlate tramite il portale di Azure e l'API di gestione delle risorse di Azure è già protetta usando il modello di controllo degli accessi in base al ruolo di Azure. Azure offre i ruoli predefiniti di Azure seguenti per autorizzare l'accesso a uno spazio dei nomi bus di servizio:
- bus di servizio di Azure Proprietario dati: consente l'accesso ai dati allo spazio dei nomi bus di servizio e alle relative entità (code, argomenti, sottoscrizioni e filtri). Un membro di questo ruolo può inviare e ricevere messaggi da code o argomenti/sottoscrizioni.
- bus di servizio di Azure Mittente dati: usare questo ruolo per concedere all'invio l'accesso allo spazio dei nomi bus di servizio e alle relative entità.
- bus di servizio di Azure Ricevitore dati: usare questo ruolo per concedere l'accesso di ricezione allo spazio dei nomi bus di servizio e alle relative entità.
Per creare un ruolo personalizzato, vedere Diritti necessari per le operazioni di bus di servizio.
Aggiungere l'utente di Microsoft Entra al ruolo proprietario bus di servizio di Azure
Aggiungere il nome utente di Microsoft Entra al ruolo proprietario dati bus di servizio di Azure a livello di spazio dei nomi bus di servizio. Consentirà a un'app in esecuzione nel contesto dell'account utente di inviare messaggi a una coda o a un argomento e di ricevere messaggi da una coda o da una sottoscrizione di un argomento.
Importante
Nella maggior parte dei casi, la propagazione dell'assegnazione di ruolo in Azure richiederà un minuto o due. In rari casi, possono essere necessari fino a otto minuti. Se si ricevono errori di autenticazione quando si esegue il codice per la prima volta, attendere alcuni istanti e riprovare.
Se la pagina spazio dei nomi bus di servizio non è aperta nella portale di Azure, individuare lo spazio dei nomi bus di servizio usando la barra di ricerca principale o lo spostamento a sinistra.
Nella pagina di panoramica selezionare Controllo di accesso (IAM) dal menu a sinistra.
Nella pagina Controllo di accesso (IAM) selezionare la scheda Assegnazioni di ruolo.
Selezionare + Aggiungi nel menu in alto e quindi Aggiungi assegnazione di ruolo nel menu a discesa risultante.
Usare la casella di ricerca per filtrare i risultati in base al ruolo desiderato. Per questo esempio, cercare
Azure Service Bus Data Owner
e selezionare il risultato corrispondente. Scegliere quindi Avanti.In Assegna accesso a selezionare Utente, gruppo o entità servizio e quindi scegliere + Seleziona membri.
Nella finestra di dialogo cercare il nome utente di Microsoft Entra (in genere l'indirizzo di posta elettronica user@domain ) e quindi scegliere Seleziona nella parte inferiore della finestra di dialogo.
Selezionare Rivedi e assegna per passare alla pagina finale e quindi rivedi e assegna per completare il processo.
Configurazione del codice
Per seguire questa guida introduttiva usando l'autenticazione senza password e il proprio account Azure:
- Installare l'interfaccia della riga di comando di Azure.
- Accedere con l'account Azure al terminale o al prompt dei comandi con
az login
. - Usare lo stesso account quando si aggiunge il ruolo appropriato alla risorsa più avanti nell'esercitazione.
- Eseguire il codice dell'esercitazione nello stesso terminale o nel prompt dei comandi.
Importante
Assicurarsi di accedere con az login
. La DefaultAzureCredential
classe nel codice senza password usa le credenziali dell'interfaccia della riga di comando di Azure per l'autenticazione con Microsoft Entra ID.
Per usare il codice senza password, è necessario specificare:
- Spazio dei nomi completo del bus di servizio, ad esempio: <service-bus-namespace.servicebus.windows.net>
- nome dell'argomento
- nome della sottoscrizione
Usare pip per installare i pacchetti
Per installare i pacchetti Python necessari per questa esercitazione bus di servizio, aprire un prompt dei comandi con Python nel percorso. Modificare la directory nella cartella in cui si vogliono avere gli esempi.
Installare i pacchetti :
pip install azure-servicebus pip install azure-identity pip install aiohttp
Inviare messaggi a un argomento
L'esempio di codice seguente illustra come inviare un batch di messaggi all'argomento del bus di servizio. Per i dettagli, vedere i commenti nel codice.
Aprire l'editor preferito, ad esempio Visual Studio Code, creare un file send.py e aggiungerne il codice seguente.
Aggiungere le istruzioni
import
seguenti.import asyncio from azure.servicebus.aio import ServiceBusClient from azure.servicebus import ServiceBusMessage from azure.identity.aio import DefaultAzureCredential
Aggiungere le costanti e definire una credenziale.
FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
Importante
- Sostituire
FULLY_QUALIFIED_NAMESPACE
con lo spazio dei nomi completo per lo spazio dei nomi bus di servizio. - Sostituire
TOPIC_NAME
con il nome dell'argomento.
Nel codice precedente è stata usata la classe della libreria client di
DefaultAzureCredential
Azure Identity. Quando l'app viene eseguita in locale durante lo sviluppo,DefaultAzureCredential
individua ed esegue automaticamente l'autenticazione in Azure usando l'account con cui è stato eseguito l'accesso all'interfaccia della riga di comando di Azure. Quando l'app viene distribuita in Azure,DefaultAzureCredential
può autenticare l'app in Microsoft Entra ID tramite un'identità gestita senza apportare modifiche al codice.- Sostituire
Aggiungere un metodo per inviare un singolo messaggio.
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")
Il mittente è un oggetto che funge da client per l'argomento creato. Verrà creato in seguito e verrà inviato come argomento a questa funzione.
Aggiungere un metodo per inviare un elenco di messaggi.
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")
Aggiungere un metodo per inviare un batch di messaggi.
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")
Creare un client del bus di servizio e quindi un oggetto mittente dell'argomento per l'invio di messaggi.
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("-----------------------")
Ricevere messaggi da una sottoscrizione
Il codice di esempio seguente illustra come ricevere messaggi da una sottoscrizione. Questo codice riceve continuamente nuovi messaggi finché non ne riceve nessuno per 5 (max_wait_time
) secondi.
Aprire l'editor preferito, ad esempio Visual Studio Code, creare un file recv.py e aggiungerne il codice seguente.
Analogamente all'esempio di invio, aggiungere
import
istruzioni, definire costanti da sostituire con i propri valori e definire le credenziali.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()
Creare un client bus di servizio e quindi un oggetto destinatario della sottoscrizione per ricevere messaggi.
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()
Chiamare il metodo
run
.asyncio.run(run())
Eseguire l'app
Aprire un prompt dei comandi con Python nel percorso e quindi eseguire il codice per inviare e ricevere messaggi per una sottoscrizione in un argomento.
python send.py; python recv.py
Verrà visualizzato l'output seguente:
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
Nel portale di Azure passare allo spazio dei nomi del bus di servizio. Nella pagina Panoramica verificare che il numero di messaggi in ingresso e in uscita sia 16. Se non viene visualizzato questo numero, aggiornare la pagina e aspettare alcuni minuti.
Selezionare l'argomento nel riquadro in basso per visualizzare la pagina Argomento del bus di servizio per l'argomento. In questa pagina verranno visualizzati tre messaggi in ingresso e tre messaggi in uscita nel grafico Messaggi.
Se in questa pagina si seleziona una sottoscrizione si passa alla pagina Sottoscrizione del bus di servizio. In questa pagina è possibile visualizzare il numero di messaggi attivi, il numero di messaggi non recapitabili e altro ancora. In questo esempio tutti i messaggi sono stati ricevuti, quindi il numero di messaggi attivi è zero.
Se si imposta come commento la coda di ricezione, si vedrà che il numero di messaggi attivi è 16.
Passaggi successivi
Vedere la documentazione e gli esempi seguenti:
- Libreria client del bus di servizio di Azure per Python
- Esempi.
- La cartella sync_samples include esempi che mostrano come interagire con il bus di servizio in modo sincrono. In questa guida di avvio rapido è stato usato questo metodo.
- La cartella async_samples include esempi che mostrano come interagire con il bus di servizio in modo asincrono.
- Documentazione di riferimento di azure-servicebus