Wysyłanie komunikatów do tematu usługi Azure Service Bus i odbieranie komunikatów z subskrypcji do tematu (Python)
W tym samouczku wykonasz następujące czynności:
- Utworzenie przestrzeni nazw usługi Service Bus za pomocą usługi Azure Portal.
- Utworzenie tematu usługi Service Bus przy użyciu witryny Azure Portal.
- Utworzenie subskrypcji tego tematu usługi Service Bus przy użyciu witryny Azure Portal.
- Napisz aplikację w języku Python, aby używać pakietu azure-servicebus do:
- Wyślij zestaw komunikatów do tematu.
- Odbieranie tych komunikatów z subskrypcji.
Uwaga
Ten przewodnik Szybki start zawiera instrukcje krok po kroku dotyczące prostego scenariusza wysyłania partii komunikatów do tematu usługi Service Bus i odbierania tych komunikatów z subskrypcji tematu. Wstępnie utworzone przykłady języka Python dla usługi Azure Service Bus można znaleźć w repozytorium zestawu Azure SDK dla języka Python w witrynie GitHub.
Wymagania wstępne
Uwaga
Ten samouczek współpracuje z przykładami, które można kopiować i uruchamiać przy użyciu języka Python. Aby uzyskać instrukcje dotyczące tworzenia aplikacji w języku Python, zobacz Tworzenie i wdrażanie aplikacji w języku Python w witrynie internetowej platformy Azure. Aby uzyskać więcej informacji na temat instalowania pakietów używanych w tym samouczku, zobacz Przewodnik instalacji języka Python.
Tworzenie przestrzeni nazw w witrynie Azure Portal
Aby rozpocząć korzystanie z obsługi wiadomości usługi Service Bus na platformie Azure, musisz najpierw utworzyć przestrzeń nazw o nazwie, która jest unikatowa w obrębie platformy Azure. Przestrzeń nazw udostępnia kontener określania zakresu dla zasobów usługi Service Bus (kolejek, tematów itp.) w aplikacji.
Aby utworzyć przestrzeń nazw:
Zaloguj się w witrynie Azure Portal.
Przejdź do strony Wszystkie usługi.
Na lewym pasku nawigacyjnym wybierz pozycję Integracja z listy kategorii, umieść wskaźnik myszy na usłudze Service Bus, a następnie wybierz + przycisk na kafelku usługi Service Bus.
W tagu Podstawowe na stronie Tworzenie przestrzeni nazw wykonaj następujące kroki:
W polu Subskrypcja wybierz subskrypcję platformy Azure, w której ma zostać utworzona przestrzeń nazw.
W polu Grupa zasobów wybierz istniejącą grupę zasobów, w której znajdzie się przestrzeń nazw, lub utwórz nową.
Wprowadź nazwę przestrzeni nazw. Nazwa przestrzeni nazw powinna być zgodna z następującymi konwencjami nazewnictwa:
- Nazwa musi być unikatowa na platformie Azure. System od razu sprawdza, czy nazwa jest dostępna.
- Długość nazwy wynosi co najmniej 6 i co najwyżej 50 znaków.
- Nazwa może zawierać tylko litery, cyfry, łączniki "-".
- Nazwa musi zaczynać się literą i kończyć literą lub cyfrą.
- Nazwa nie kończy się ciągiem "-sb" ani "-mgmt".
W polu Lokalizacja wybierz region, w którym powinna być hostowana przestrzeń nazw.
W obszarze Warstwa cenowa wybierz warstwę cenową (Podstawowa, Standardowa lub Premium) dla przestrzeni nazw. W tym przewodniku Szybki start wybierz pozycję Standardowa.
Ważne
Jeśli chcesz korzystać z tematów i subskrypcji, wybierz warstwę Standardowa lub Premium. Tematy/subskrypcje nie są obsługiwane w warstwie cenowej Podstawowa.
W przypadku wybrania warstwy cenowej Premium określ liczbę jednostek obsługi komunikatów. Warstwa Premium zapewnia izolację zasobów na poziomie procesora i pamięci, dlatego poszczególne obciążenia są od siebie odizolowane. Ten kontener zasobów jest nazywany jednostką obsługi komunikatów. Przestrzeń nazw w warstwie Premium ma co najmniej jedną jednostkę obsługi komunikatów. Możesz wybrać 1, 2, 4, 8 lub 16 jednostek obsługi komunikatów dla każdej przestrzeni nazw usługi Service Bus Premium. Aby uzyskać więcej informacji, zobacz Obsługa komunikatów w usłudze Service Bus w warstwie Premium.
Wybierz pozycję Przejrzyj i utwórz w dolnej części strony.
Na stronie Przeglądanie + tworzenie przejrzyj ustawienia i wybierz pozycję Utwórz.
Po pomyślnym wdrożeniu zasobu wybierz pozycję Przejdź do zasobu na stronie wdrożenia.
Zostanie wyświetlona strona główna dla przestrzeni nazw usługi Service Bus.
Tworzenie tematu przy użyciu witryny Azure Portal
Na stronie Przestrzeń nazw usługi Service Bus wybierz pozycję Tematy z menu po lewej stronie.
Wybierz pozycję + Temat na pasku narzędzi.
Wprowadź nazwę tematu. Pozostaw inne opcje z wartościami domyślnymi.
Wybierz pozycję Utwórz.
Tworzenie subskrypcji tematu
Wybierz temat utworzony w poprzedniej sekcji.
Na stronie Temat usługi Service Bus wybierz pozycję + Subskrypcja na pasku narzędzi.
Na stronie Tworzenie subskrypcji wykonaj następujące kroki:
Wprowadź S1 jako nazwę subskrypcji.
Wprowadź wartość 3 w polu Maksymalna liczba dostaw.
Następnie wybierz pozycję Utwórz , aby utworzyć subskrypcję.
Uwierzytelnianie aplikacji na platformie Azure
W tym przewodniku Szybki start przedstawiono dwa sposoby nawiązywania połączenia z usługą Azure Service Bus: bez hasła i parametry połączenia.
Pierwsza opcja pokazuje, jak używać podmiotu zabezpieczeń w usłudze Microsoft Entra ID i kontroli dostępu opartej na rolach (RBAC) w celu nawiązania połączenia z przestrzenią nazw usługi Service Bus. Nie musisz martwić się o zakodowane parametry połączenia w kodzie lub w pliku konfiguracji lub w bezpiecznym magazynie, na przykład Azure Key Vault.
Druga opcja pokazuje, jak używać parametry połączenia do nawiązywania połączenia z przestrzenią nazw usługi Service Bus. Jeśli dopiero zaczynasz korzystać z platformy Azure, możesz znaleźć opcję parametry połączenia łatwiejszą do naśladowania. Zalecamy użycie opcji bez hasła w rzeczywistych aplikacjach i środowiskach produkcyjnych. Aby uzyskać więcej informacji, zobacz Uwierzytelnianie i autoryzacja. Więcej informacji na temat uwierzytelniania bez hasła można również uzyskać na stronie przeglądu.
Przypisywanie ról do użytkownika firmy Microsoft Entra
Podczas tworzenia aplikacji lokalnie upewnij się, że konto użytkownika, które nawiązuje połączenie z usługą Azure Service Bus, ma odpowiednie uprawnienia. Aby wysyłać i odbierać komunikaty, musisz mieć rolę Właściciela danych usługi Azure Service Bus. Aby przypisać sobie tę rolę, musisz mieć rolę Administratora dostępu użytkowników lub inną rolę obejmującą Microsoft.Authorization/roleAssignments/write
akcję. Role RBAC platformy Azure można przypisać użytkownikowi przy użyciu witryny Azure Portal, interfejsu wiersza polecenia platformy Azure lub programu Azure PowerShell. Dowiedz się więcej o dostępnych zakresach przypisań ról na stronie przeglądu zakresu.
Poniższy przykład przypisuje Azure Service Bus Data Owner
rolę do konta użytkownika, co zapewnia pełny dostęp do zasobów usługi Azure Service Bus. W rzeczywistym scenariuszu postępuj zgodnie z zasadą najniższych uprawnień , aby dać użytkownikom tylko minimalne uprawnienia wymagane do bezpieczniejszego środowiska produkcyjnego.
Wbudowane role platformy Azure dla usługi Azure Service Bus
W przypadku usługi Azure Service Bus zarządzanie przestrzeniami nazw i wszystkimi powiązanymi zasobami za pośrednictwem witryny Azure Portal i interfejsu API zarządzania zasobami platformy Azure jest już chronione przy użyciu modelu RBAC platformy Azure. Platforma Azure udostępnia poniższe wbudowane role platformy Azure umożliwiające autoryzowanie dostępu do przestrzeni nazw usługi Service Bus:
- Właściciel danych usługi Azure Service Bus: umożliwia dostęp danych do przestrzeni nazw usługi Service Bus i jej jednostek (kolejek, tematów, subskrypcji i filtrów). Członek tej roli może wysyłać i odbierać komunikaty z kolejek lub tematów/subskrypcji.
- Nadawca danych usługi Azure Service Bus: użyj tej roli, aby udzielić dostępu do przestrzeni nazw usługi Service Bus i jej jednostek.
- Odbiornik danych usługi Azure Service Bus: ta rola umożliwia uzyskiwanie dostępu do przestrzeni nazw usługi Service Bus i jej jednostek.
Jeśli chcesz utworzyć rolę niestandardową, zobacz Prawa wymagane dla operacji usługi Service Bus.
Dodawanie użytkownika usługi Microsoft Entra do roli właściciela usługi Azure Service Bus
Dodaj nazwę użytkownika usługi Microsoft Entra do roli właściciela danych usługi Azure Service Bus na poziomie przestrzeni nazw usługi Service Bus. Umożliwi to aplikacji działającej w kontekście konta użytkownika wysyłanie komunikatów do kolejki lub tematu oraz odbieranie komunikatów z kolejki lub subskrypcji tematu.
Ważne
W większości przypadków propagacja przypisania roli na platformie Azure potrwa minutę lub dwie. W rzadkich przypadkach może upłynąć do ośmiu minut. Jeśli podczas pierwszego uruchomienia kodu wystąpią błędy uwierzytelniania, zaczekaj chwilę i spróbuj ponownie.
Jeśli nie masz otwartej strony przestrzeni nazw usługi Service Bus w witrynie Azure Portal, znajdź przestrzeń nazw usługi Service Bus przy użyciu głównego paska wyszukiwania lub nawigacji po lewej stronie.
Na stronie przeglądu wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami) z menu po lewej stronie.
Na stronie Kontrola dostępu (Zarządzanie dostępem i tożsamościami) wybierz kartę Przypisania ról.
Wybierz pozycję + Dodaj z górnego menu, a następnie pozycję Dodaj przypisanie roli z wyświetlonego menu rozwijanego.
Użyj pola wyszukiwania, aby filtrować wyniki do żądanej roli. W tym przykładzie wyszukaj
Azure Service Bus Data Owner
i wybierz pasujący wynik. Następnie wybierz pozycję Dalej.W obszarze Przypisz dostęp do wybierz pozycję Użytkownik, grupa lub jednostka usługi, a następnie wybierz pozycję + Wybierz członków.
W oknie dialogowym wyszukaj nazwę użytkownika firmy Microsoft Entra (zazwyczaj adres e-mail user@domain ), a następnie wybierz pozycję Wybierz w dolnej części okna dialogowego.
Wybierz pozycję Przejrzyj i przypisz , aby przejść do ostatniej strony, a następnie ponownie przejrzyj i przypisz, aby ukończyć proces.
Konfiguracja kodu
Aby wykonać czynności opisane w tym przewodniku Szybki start, użyj uwierzytelniania bez hasła i własnego konta platformy Azure:
- Zainstaluj interfejs wiersza polecenia platformy Azure.
- Zaloguj się przy użyciu konta platformy Azure w terminalu lub wierszu polecenia za pomocą polecenia
az login
. - Użyj tego samego konta podczas dodawania odpowiedniej roli do zasobu w dalszej części samouczka.
- Uruchom kod samouczka w tym samym terminalu lub wierszu polecenia.
Ważne
Upewnij się, że logujesz się przy użyciu polecenia az login
. Klasa DefaultAzureCredential
w kodzie bez hasła używa poświadczeń interfejsu wiersza polecenia platformy Azure do uwierzytelniania za pomocą identyfikatora Entra firmy Microsoft.
Aby użyć kodu bez hasła, należy określić:
- w pełni kwalifikowana przestrzeń nazw usługi Service Bus, na przykład: <service-bus-namespace.servicebus.windows.net>
- nazwa tematu
- Nazwa subskrypcji
Instalowanie pakietów przy użyciu narzędzia
Aby zainstalować wymagane pakiety języka Python na potrzeby tego samouczka usługi Service Bus, otwórz wiersz polecenia z językiem Python w swojej ścieżce. Zmień katalog na folder, w którym chcesz mieć przykłady.
Instalowanie pakietów:
pip install azure-servicebus pip install azure-identity pip install aiohttp
Wysyłanie komunikatów do tematu
Poniższy przykładowy kod przedstawia sposób wysyłania partii komunikatów do tematu usługi Service Bus. Aby uzyskać szczegółowe informacje, zobacz komentarze kodu.
Otwórz ulubiony edytor, taki jak Visual Studio Code, utwórz plik send.py i dodaj do niego następujący kod.
Dodaj następujące instrukcje
import
.import asyncio from azure.servicebus.aio import ServiceBusClient from azure.servicebus import ServiceBusMessage from azure.identity.aio import DefaultAzureCredential
Dodaj stałe i zdefiniuj poświadczenia.
FULLY_QUALIFIED_NAMESPACE = "FULLY_QUALIFIED_NAMESPACE" TOPIC_NAME = "TOPIC_NAME" credential = DefaultAzureCredential()
Ważne
- Zastąp
FULLY_QUALIFIED_NAMESPACE
element w pełni kwalifikowaną przestrzenią nazw dla przestrzeni nazw usługi Service Bus. - Zastąp
TOPIC_NAME
ciąg nazwą tematu.
W poprzednim kodzie użyto klasy biblioteki
DefaultAzureCredential
klienta usługi Azure Identity. Gdy aplikacja działa lokalnie podczas programowania,DefaultAzureCredential
automatycznie odnajdzie i uwierzytelnia się na platformie Azure przy użyciu konta zalogowanego do interfejsu wiersza polecenia platformy Azure. Po wdrożeniu aplikacji na platformie AzureDefaultAzureCredential
można uwierzytelnić aplikację w usłudze Microsoft Entra ID za pośrednictwem tożsamości zarządzanej bez żadnych zmian w kodzie.- Zastąp
Dodaj metodę wysyłania pojedynczego komunikatu.
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")
Nadawca jest obiektem, który działa jako klient utworzonego tematu. Utworzysz go później i wyślesz jako argument do tej funkcji.
Dodaj metodę do wysyłania listy komunikatów.
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")
Dodaj metodę do wysyłania partii komunikatów.
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")
Utwórz klienta usługi Service Bus, a następnie obiekt nadawcy tematu do wysyłania komunikatów.
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("-----------------------")
Odbieranie komunikatów z subskrypcji
Poniższy przykładowy kod pokazuje, jak odbierać komunikaty z subskrypcji. Ten kod stale odbiera nowe komunikaty, dopóki nie otrzyma żadnych nowych komunikatów przez 5 (max_wait_time
) sekund.
Otwórz ulubiony edytor, taki jak Visual Studio Code, utwórz plik recv.py i dodaj do niego następujący kod.
Podobnie jak w przykładzie wysyłania, dodaj
import
instrukcje, zdefiniuj stałe, które należy zastąpić własnymi wartościami i zdefiniuj poświadczenia.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()
Utwórz klienta usługi Service Bus, a następnie obiekt odbiorcy subskrypcji w celu odbierania komunikatów.
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()
Wywołaj metodę
run
.asyncio.run(run())
Uruchom aplikację
Otwórz wiersz polecenia z językiem Python w swojej ścieżce, a następnie uruchom kod, aby wysyłać i odbierać komunikaty dla subskrypcji w ramach tematu.
python send.py; python recv.py
Powinny zostać wyświetlone następujące dane wyjściowe:
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
W witrynie Azure Portal przejdź do przestrzeni nazw usługi Service Bus. Na stronie Przegląd sprawdź, czy liczba komunikatów przychodzących i wychodzących to 16. Jeśli nie widzisz liczników, odśwież stronę po odczekaniu kilku minut.
Wybierz temat w dolnym okienku, aby wyświetlić stronę Temat usługi Service Bus dla tematu. Na tej stronie powinny zostać wyświetlone trzy przychodzące i trzy komunikaty wychodzące na wykresie Komunikaty .
Na tej stronie po wybraniu subskrypcji zostanie wyświetlona strona Subskrypcja usługi Service Bus. Możesz zobaczyć liczbę aktywnych komunikatów, liczbę komunikatów utraconych i więcej na tej stronie. W tym przykładzie odebrano wszystkie komunikaty, więc liczba aktywnych komunikatów wynosi zero.
Jeśli oznaczysz jako komentarz kod odbioru, zobaczysz aktywną liczbę komunikatów jako 16.
Następne kroki
Zapoznaj się z następującą dokumentacją i przykładami:
- Biblioteka klienta usługi Azure Service Bus dla języka Python
- Przykłady.
- Folder sync_samples zawiera przykłady pokazujące sposób interakcji z usługą Service Bus w sposób synchroniczny. W tym przewodniku Szybki start użyto tej metody.
- Folder async_samples zawiera przykłady pokazujące sposób interakcji z usługą Service Bus w sposób asynchroniczny.
- dokumentacja referencyjna usługi azure-servicebus