Co to jest RabbitMQ?
W dowolnej aplikacji natywnej dla chmury mikrousługi muszą komunikować się w celu uzyskania wszystkich informacji potrzebnych do reagowania na użytkowników. Upewnij się, że ta obsługa komunikatów jest niezawodna, nawet jeśli występują problemy z siecią lub awarie między integracją. RabbitMQ to jedno z narzędzi, których można użyć do zwiększenia niezawodności obsługi komunikatów.
W sklepie detalicznym sprzętu zewnętrznego szybko postępujesz z mikrousługami. Jednak w aplikacji testując niektóre wywołania z jednej mikrousługi do innej wydają się być utracone. Chcesz upewnić się, że ten problem nie występuje w środowisku produkcyjnym, w którym zagrożone jest reputacja firmy.
W tej lekcji dowiesz się, jak firma RabbitMQ może utworzyć elastyczną i odporną platformę komunikacji dla mikrousług.
Dlaczego warto używać brokera komunikatów w aplikacji natywnej dla chmury?
Aplikacje natywne dla chmury składają się z niezależnych mikrousług, często tworzonych przez oddzielne zespoły i używając różnych technologii i języków. Każdy zespół ma własne przebiegi programowania i harmonogramy uaktualniania oraz może wdrażać poprawki i nowe funkcje w sposób ciągły. Jednak po odebraniu żądania od użytkownika mikrousługi odbierającej ją prawie zawsze muszą wywoływać inne mikrousługi i usługi zapasowe oraz otrzymywać od nich odpowiedzi w celu sformułowania pełnej odpowiedzi.
Oczywiście format i schemat tych żądań i odpowiedzi między usługami muszą być uzgodnione między zespołami deweloperów i rzadko się zmieniać. Są one zwykle implementowane jako interfejsy API REST. Należy preferencyjnie zaimplementować nowe funkcje każdego interfejsu bez zmiany istniejących metod i parametrów. Jeśli jednak zdecydujesz się na bezpośrednią komunikację mikrousług, może wystąpić kilka problemów:
- Kiedy docelowa mikrousługa jest w trybie offline lub zajęta, co się stanie z wysłanymi do niej komunikatami? Jakie są konsekwencje utraty komunikatów?
- Jak można wysłać ten sam komunikat do więcej niż jednego miejsca docelowego?
- Jeśli mikrousługa jest uruchomiona w więcej niż jednym kontenerze, do którego należy wysyłać komunikaty?
Broker komunikatów to oprogramowanie pośredniczące, które rozwiązuje te problemy. Usługi wysyłają komunikaty do brokera komunikatów zamiast bezpośrednio do miejsca docelowego. Broker przechowuje je w kolejkach w kolejności, w której docierają. Usługi docelowe subskrybują te kolejki i odbierają komunikaty pojedynczo na potrzeby przetwarzania.
Jeśli usługa docelowa jest niedostępna, mikrousługa wysyłająca nadal może umieszczać komunikaty w kolejce. Gdy miejsce docelowe zostanie uruchomione ponownie, nadal pobiera komunikaty z kolejki z tego samego punktu. Żadne komunikaty nie zostaną utracone, chociaż nadawca musi czekać dłużej.
Ponieważ więcej niż jedno miejsce docelowe może subskrybować kolejkę, jeden komunikat może zostać odebrany przez więcej niż jedną mikrousługę. Ponadto, gdy wiele kontenerów hostuje wystąpienia pojedynczej mikrousługi, pierwsze wystąpienie, które staje się dostępne, pobiera komunikat. Broker automatycznie dystrybuuje komunikaty do wystąpień w celu rozłożenia obciążenia.
Co to jest RabbitMQ?
RabbitMQ jest jednym z najpopularniejszych brokerów komunikatów i ma wiele funkcji, które sprawiają, że jest idealnym kandydatem do obsługi komunikacji w aplikacji natywnej dla chmury. Zawartość:
- Serwer RabbitMQ, który hostuje kolejki. Serwer obsługuje klastrowanie i tryb failover w celu zapewnienia wysokiej dostępności i może działać w kontenerach.
- Implementacje zaawansowanego protokołu kolejkowania komunikatów (AMQP), prostego protokołu komunikatów zorientowanych na tekst (STOMP) i transportu telemetrii kolejkowania komunikatów (MQTT).
- Biblioteki klienckie amQP, których można używać na platformie .NET, w języku Java i Erlang.
Pojęcia dotyczące oprogramowania RabbitMQ
W kategoriach RabbitMQ mikrousługi, które wysyłają i odbierają komunikaty, są klientami. Klienci wysyłający komunikaty są określanymi jako producenci komunikatów. Klienci odbierający komunikaty są odbiorcami komunikatów. Usługa RabbitMQ jest brokerem komunikatów.
Jak wysyłać komunikaty
RabbitMQ jest wszechstronny i zdolny do implementowania wielu różnych modeli kolejkowania. Przyjrzyjmy się niektórym popularnym wzorom.
Jeśli masz jednego producenta i jednego konsumenta, użyjesz jednej kolejki, a wszystkie komunikaty docierają do tego samego miejsca docelowego. Nawet w tej prostej konfiguracji utworzysz niezawodny system obsługi komunikatów, który bezproblemowo obsługuje awarie:
Wysyłanie komunikatów do konkurencyjnych odbiorców
W modelu konkurencyjnych odbiorców producent wysyła komunikaty do pojedynczej kolejki roboczej. Co najmniej dwóch użytkowników pobiera komunikaty z kolejki. Konsumenci konkurują o pobieranie komunikatów, ponieważ każdy komunikat może być pobierany tylko przez jednego konsumenta.
Ten wzorzec jest przydatny w aplikacjach natywnych dla chmury, gdy korzystasz z mikrousługi hostowanej w wielu kontenerach, aby zwiększyć pojemność. Każdy komunikat osiągnie tylko jedno wystąpienie odbiorcy, więc będzie przetwarzany tylko raz. Praca nie zostanie zduplikowana.
Publikowanie i subskrybowanie
Jeśli chcesz wysłać jeden komunikat od producenta do wielu odbiorców, użyj modelu publikowania/subskrybowania . Producent wysyła wiadomości do wymiany. Każdy użytkownik subskrybuje komunikaty z tej wymiany. Po zasubskrybowaniu program RabbitMQ tworzy nową kolejkę służbową dla tej subskrypcji. Każdy komunikat jest kopiowany do każdej kolejki dla tej wymiany i jest odbierany przez każdego odbiorcę, który subskrybuje. Konsumenci nie konkurują o każdą wiadomość. Zamiast tego wszyscy otrzymują kopię każdej wiadomości.
Model publikowania/subskrybowania używa wymiany fanout , która kopiuje każdy komunikat do każdej kolejki roboczej.
Ten wzorzec jest przydatny, gdy każdy komunikat ma być przetwarzany przez wiele mikrousług. Na przykład gdy klient wyewidencjonuje koszyk, może być konieczne wysłanie komunikatu o liczbie zakupionych produktów. Ten komunikat powinien dotrzeć zarówno do mikrousługi wysyłkowej, aby poinstruować magazyn, aby spakował paczkę, jak i mikrousługę magazynową, aby odkreślić numery zapasów, a być może wyzwolić zamówienia dostawcom.
Routing komunikatów i tematów
Czasami chcesz dystrybuować pojedyncze komunikaty do wielu odbiorców, ale dla każdego konsumenta zastosuj filtr. Ten wzorzec jest nazywany routerem komunikatów. Podobnie jak w modelu publikowania/subskrybowania, konsumenci subskrybują wymianę, aby utworzyć wiele kolejek roboczych. Jednak zamiast wymiany fanout model używa bezpośredniej wymiany. W przypadku tej wymiany każda subskrypcja ma klucz powiązania. Do tej subskrypcji są wysyłane tylko komunikaty, których klucz routingu odpowiada kluczowi powiązania. Inne są odfiltrowane.
Ten wzorzec jest przydatny, gdy niektórzy użytkownicy powinni przetwarzać tylko podzbiór strumienia komunikatów. Załóżmy na przykład, że masz mikrousługę, która wysyła komunikaty w przypadku wystąpienia błędów. Wszystkie błędy powinny być wysyłane do mikrousługi rejestrowania. Błędy krytyczne powinny być wysyłane do mikrousługi administracyjnej, która powiadomi inżynierów o rozwiązaniu problemu.
Bezpośrednia wymiana kieruje komunikaty na podstawie jednego kryterium. Aby jeszcze bardziej elastyczne elementy, można użyć wymiany tematów . Dla każdego komunikatu można użyć klucza routingu z wieloma terminami oddzielonymi kropkami. W kluczu powiązania można użyć symboli wieloznacznych *, aby zastąpić dokładnie jeden wyraz lub # zastąpić zero lub więcej wyrazów.
Uwaga
Alternatywy dla RabbitMQ obejmują platformy Apache Kafka i usługę Azure Service Bus. Oba te brokery komunikatów są obsługiwane przez dedykowane integracje na platformie .NET Aspire. Poznasz usługę Azure Service Bus w późniejszym module w tej ścieżce szkoleniowej.
Dowiedz się więcej
- Samouczki rabbitMQ
- Integracja platformy .NET Aspire RabbitMQ
- Integracja platformy Apache Kafka z platformą .NET Aspire