M365Con 2027 – bezpłatna konferencja online · 11–22 Jan 2027 · 120 sessions→ m365con.net

Blog · Mirko Peters

Kolejki kontra tematy: wybór właściwego wzorca komunikacji w Azure Service Bus

By ·

Witamy ponownie na blogu towarzyszącym podcastowi! W najnowszym odcinku zagłębiliśmy się w podstawowe elementy komunikacji w chmurze. Jeśli jeszcze nie miałeś/aś szansy…

Automatically translated with AI from the original post. Read the English original

Cover: Azure Service Bus - Simply Explained

Witamy ponownie w towarzyszącym podcastowi blogu! W najnowszym odcinku zagłębiliśmy się w podstawowe elementy komunikacji w chmurze. Jeśli jeszcze nie mieliście okazji go posłuchać, koniecznie sprawdźcie odcinek Azure Service Bus - Simply Explained. Dzisiaj rozwiniemy jedną z najważniejszych decyzji architektonicznych, przed jaką stajecie podczas budowy rozproszonych aplikacji: wyboru między kolejkami a tematami w Azure Service Bus. Zrozumienie niuansów tych dwóch wzorców komunikacji pomoże zaprojektować systemy bardziej odporne, skalowalne i łatwiejsze w utrzymaniu.

Wprowadzenie do Azure Service Bus i wzorców komunikacji

Gdy nowoczesne aplikacje odchodzą od architektur monolitycznych na rzecz rozproszonych projektów opartych na mikrousługach, niezawodna komunikacja staje się kluczowa. Usługi nie mogą po prostu polegać na synchronicznych wywołaniach HTTP we wszystkim; takie podejście prowadzi do silnego sprzężenia, kaskadowych awarii i wąskich gardeł wydajnościowych. Tu do akcji wkraczają brokerzy komunikatów w chmurze.

Azure Service Bus działa jako w pełni zarządzany korporacyjny broker komunikatów, który rozdziela aplikacje i usługi. Pozwala producentom wysyłać komunikaty bez konieczności znajomości odbiorcy — a nawet tego, czy odbiorca jest w danej chwili online — dzięki czemu Azure Service Bus zapewnia wysoką dostępność i płynne wyrównywanie obciążenia. Jednak gdy zdecydujecie się na Azure Service Bus, od razu stajecie przed podstawowym pytaniem projektowym: czy potrzebuję kolejki, czy tematu?

Czym jest Azure Service Bus?

Zanim przejdziemy do różnic między kolejkami a tematami, warto przypomnieć sobie, co faktycznie robi Azure Service Bus. W swojej istocie jest to broker komunikatów, który bezpiecznie przechowuje komunikaty w przestrzeni nazw, dopóki aplikacja odbiorcza nie będzie gotowa do ich przetworzenia. Oferuje solidne funkcje, takie jak gwarancja dostarczenia co najmniej raz (at-least-once), obsługa sesji, przenoszenie do kolejki martwych liter (dead-lettering) oraz zaplanowane dostarczanie komunikatów.

W ekosystemie chmurowym Azure Service Bus łączy różne komponenty aplikacji. Niezależnie od tego, czy przetwarzacie zamówienia e-commerce, obsługujecie telemetrię Internetu rzeczy (IoT), czy koordynujecie integracje z systemami planowania zasobów przedsiębiorstwa (ERP), Service Bus zapewnia trwałość i moc asynchronicznego przetwarzania potrzebne, by dane płynnie przepływały.

Kolejki kontra tematy: podstawowy wybór architektoniczny

Zasadnicza różnica między kolejkami a tematami sprowadza się do wzorca komunikacji, który obsługują: punkt-punkt kontra publikacja/subskrypcja. Wybór niewłaściwego wzorca może w dalszej perspektywie prowadzić do przeróbek architektury, problemów z duplikacją danych lub wąskich gardeł skalowalności.

Kolejka zapewnia model komunikacji jeden-do-jednego. Gdy wysyłacie komunikat do kolejki, dokładnie jeden konsument odczyta go i przetworzy. Z kolei temat zapewnia wzorzec jeden-do-wielu. Gdy publikujecie komunikat w temacie, zostaje on rozesłany do wielu subskrypcji, dzięki czemu wiele niezależnych usług podrzędnych może odebrać i przetworzyć kopię dokładnie tego samego komunikatu.

Wybór między tymi dwoma wzorcami zależy wyłącznie od wymagań biznesowych. Czy macie pojedyncze obciążenie, które trzeba rozdzielić między instancje robocze w celu równoważenia obciążenia, czy też wiele różnorodnych systemów, które mają reagować na jedno zdarzenie biznesowe?

Szczegółowe omówienie kolejek Service Bus

Kolejki Service Bus są koniem pociągowym tradycyjnej komunikacji korporacyjnej. Zostały zaprojektowane do scenariuszy, w których pojedyncze zadanie ma zostać wykonane dokładnie raz przez pulę workerów.

Gdy wysyłacie komunikat do kolejki, pozostaje on w niej, dopóki odbiorca go nie pobierze. Domyślnie kolejki wymuszają kolejność dostarczania FIFO (First-In, First-Out). Dzięki temu są idealne w architekturach sterowanych poleceniami, w których kolejność ma znaczenie, na przykład przy przetwarzaniu transakcji płatniczych lub wykonywaniu kolejnych kroków przepływu pracy.

Ponadto kolejki świetnie sprawdzają się w wyrównywaniu obciążenia. Jeśli aplikacja doświadcza gwałtownego skoku ruchu, przychodzące żądania mogą bezpiecznie gromadzić się w kolejce, nie przeciążając zasobów obliczeniowych zaplecza. Usługi robocze mogą wtedy pobierać komunikaty z kolejki w stabilnym, równomiernym tempie.

Zagłębianie się w tematy i subskrypcje

Podczas gdy kolejki obsługują prostą dostawę typu punkt-punkt, tematy (topics) otwierają możliwości architektur publikuj/subskrybuj (publish/subscribe, pub/sub). Temat działa jako punkt końcowy do wysyłania komunikatów, ale sam z siebie nie może przechowywać komunikatów bez subskrypcji.

Subskrypcję można traktować jak wirtualną kolejkę przypisaną do tematu. Gdy komunikat zostaje opublikowany w temacie, kopia tego komunikatu trafia do każdej aktywnej subskrypcji. Każda usługa konsumująca tworzy własną subskrypcję do tematu, dzięki czemu może przetwarzać komunikat niezależnie od pozostałych konsumentów.

Weźmy na przykład zdarzenie złożenia zamówienia na platformie e-commerce. Gdy klient składa zamówienie, system publikuje komunikat OrderPlaced w temacie. Usługa magazynowa ma subskrypcję do aktualizacji stanów magazynowych, usługa rozliczeniowa ma subskrypcję do przetworzenia płatności, a usługa powiadomień ma subskrypcję do wysłania potwierdzenia e-mailem. Wszystkie trzy systemy otrzymują zdarzenie jednocześnie, nie zakłócając wzajemnie swojej pracy.

Filtrowanie komunikatów i elastyczność

Jedną z najpotężniejszych funkcji tematów w usłudze Azure Service Bus jest filtrowanie komunikatów. W wielu scenariuszach pub/sub subskrybent nie chce otrzymywać każdego komunikatu opublikowanego w temacie; interesuje go tylko określony podzbiór danych.

Usługa Azure Service Bus pozwala definiować reguły i filtry dla subskrypcji, używając składni przypominającej SQL lub właściwości korelacji. Na przykład możesz skonfigurować subskrypcję tak, aby otrzymywała wyłącznie komunikaty, w których właściwość Region ma wartość NorthAmerica, lub te, w których właściwość OrderAmount przekracza określony próg.

Dzięki tej możliwości filtrowania ruch sieciowy pozostaje ograniczony do niezbędnego minimum, a konsumenci dalszego etapu przetwarzają wyłącznie dane istotne dla nich, co znacząco redukuje niepotrzebne obciążenie obliczeniowe.

Obsługa błędów z użyciem kolejek martwych liter

Niezależnie od tego, czy używasz kolejek, czy tematów, systemy rozproszone są podatne na awarie. Co się dzieje, gdy komunikat jest uszkodzony, baza danych w dalszym etapie przestaje działać albo aplikacja wielokrotnie ulega awarii podczas przetwarzania konkretnego komunikatu?

Usługa Azure Service Bus radzi sobie z tym w sposób kontrolowany dzięki kolejkom martwych liter (dead-letter queues, DLQ). Każda kolejka i każda subskrypcja tematu ma powiązaną podkolejkę, zwaną kolejką martwych liter. Jeśli przetwarzanie komunikatu nie powiedzie się zbyt wiele razy (przekroczy maksymalną liczbę dostarczeń) lub komunikat wygaśnie, Service Bus automatycznie przenosi go do DLQ.

Ten mechanizm izoluje „trujące komunikaty” (poison messages), dzięki czemu nie blokują głównego potoku przetwarzania. Inżynierowie mogą sprawdzić DLQ, przeanalizować przyczynę błędu, naprawić błąd w kodzie, a następnie ponownie przesłać komunikat do głównego przepływu pracy, aby został pomyślnie przetworzony.

Najlepsze praktyki projektowania aplikacji rozproszonych

Aby w pełni wykorzystać wdrożenie usługi Azure Service Bus, warto przestrzegać sprawdzonych praktyk architektonicznych:

  • Izolacja środowisk: Używaj oddzielnych przestrzeni nazw Service Bus dla środowisk deweloperskiego, testowego i produkcyjnego, aby zapobiec propagacji awarii między środowiskami.
  • Wdrażaj infrastrukturę jako kod: Definiuj kolejki, tematy, subskrypcje i filtry za pomocą szablonów ARM, Bicep lub Terraform, aby zapewnić spójne wdrożenia.
  • Ustaw odpowiednie zasady przechowywania: Konfiguruj czas życia komunikatu (TTL) i czasy blokady na podstawie rzeczywistych potrzeb biznesowych, zamiast polegać na domyślnych maksimach.
  • Monitoruj i twórz alerty: Wykorzystaj Azure Monitor i Application Insights do śledzenia metryk, takich jak liczba komunikatów, aktywne komunikaty w kolejkach martwych liter oraz opóźnienie serwera.

Podsumowanie: wybór właściwego wzorca dla Twojej architektury

Wybór odpowiedniego wzorca komunikacji w usłudze Azure Service Bus stanowi podstawę budowy odpornych, skalowalnych aplikacji chmurowych. Używaj kolejek, gdy potrzebujesz niezawodnego mechanizmu typu jeden-do-jednego (punkt-punkt) do równoważenia obciążenia i sekwencyjnego przetwarzania zadań. Wybieraj tematy i subskrypcje, gdy potrzebujesz modelu publikuj/subskrybuj do rozgłaszania zdarzeń do wielu niezależnych systemów.

Aby posłuchać więcej dyskusji o architekturze chmury, bezpieczeństwie i nowoczesnych wzorcach programistycznych, koniecznie posłuchaj całego odcinka: Azure Service Bus - Simply Explained. Poprawne wdrożenie tych wzorców komunikacji zapewni, że Twoje aplikacje chmurowe pozostaną solidne, elastyczne i gotowe do skalowania pod każdym obciążeniem.

Entities in this article

Azure Service Bus Message broker At-least-once delivery Dead-lettering Enterprise resource planning (ERP) High availability HTTP Internet of Things (IoT) Telemetry

Related articles

RSS