W tym artykule przyjrzymy się, w jaki sposób można przyspieszyć działanie stron internetowych poprzez asynchroniczne wykonywanie najbardziej obciążających procesów. Zastosujemy do tego celu RabbitMQ, które w prosty sposób umożliwia zarządzanie tego typu zadaniami.
Stabilność i szybkość działania serwisów internetowych oraz aplikacji to kluczowe czynniki wpływające na satysfakcję użytkowników. Z pewnością każdy z nas doświadczył sytuacji, gdy długi czas ładowania strony zniechęcił do jej dalszego przeglądania.
Czym właściwie jest RabbitMQ?
RabbitMQ to otwartoźródłowy, rozproszony i skalowalny broker wiadomości. Pełni on rolę pośrednika umożliwiającego efektywną komunikację pomiędzy aplikacjami, które wysyłają komunikaty (producenci), a tymi, które je odbierają i przetwarzają (konsumenci).
RabbitMQ bazuje na protokole AMQP (Advanced Message Queuing Protocol), który definiuje sposób przesyłania wiadomości w warstwie aplikacji. Protokół ten kładzie nacisk na asynchroniczną wymianę komunikatów, gwarantując ich dostarczenie poprzez mechanizm potwierdzeń odbioru. Potwierdzenia te przesyłane są od brokera do producenta i od konsumentów do brokera.
Zasada działania RabbitMQ
W uproszczeniu, RabbitMQ umożliwia tworzenie kolejek, w których przechowywane są komunikaty wysyłane przez producentów. Komunikaty te oczekują w kolejce, aż zostaną pobrane i przetworzone przez odpowiednie aplikacje konsumujące. Dzięki takiemu podejściu można projektować systemy rozproszone składające się z niezależnych modułów, które komunikują się ze sobą za pomocą wiadomości.
Podobnie jak w każdej komunikacji, w tym modelu potrzebujemy producenta, kanału przesyłowego i odbiorcy. Centralnym elementem jest tutaj RabbitMQ – miejsce, w którym wiadomość czeka na odbiór przez konsumenta.
Aby lepiej zrozumieć sposób działania RabbitMQ, warto poznać rodzaje wymian, które odpowiadają za przekazywanie wiadomości.
Typy wymiany wiadomości
W przypadku RabbitMQ, wysyłając wiadomość, nie kierujemy jej bezpośrednio do kolejki. Zamiast tego, wiadomość trafia do centralnego punktu, czyli tzw. wymiany, która następnie decyduje, do których kolejek komunikat powinien zostać przekazany.
Rodzaje wymian w RabbitMQ to: bezpośrednia (Direct), rozgłoszeniowa (Fanout), tematyczna (Topic) i nagłówkowa (Headers).
Wymiana bezpośrednia (Direct)
Wyobraźmy sobie sytuację, w której producent musi wysłać powiadomienie o zrealizowanym zakupie do trzech różnych konsumentów. W takim przypadku system musi nawiązać komunikację z trzema różnymi systemami, aby zrealizować transakcję.
RabbitMQ, wysyłając wiadomość osobno do każdej kolejki, sprawia, że te systemy otrzymują wiadomość w sposób bezpośredni.
Zazwyczaj wymiana przekazuje wiadomości do kolejek, ale często chcemy uniknąć sytuacji, w której wiadomości są rozsyłane do wszystkich kolejek. W tym celu można zastosować pewne warunki.
Dzięki temu możemy skierować wiadomość tylko do konkretnego konsumenta, zamiast rozsyłać ją do wszystkich dostępnych.
Klucz powiązania (Binding Key): Aby połączyć kolejkę z wymianą, należy utworzyć powiązanie, relację między tymi dwoma elementami. Można to porównać do swego rodzaju łącznika.
Klucz routingu (Routing Key): W ramach tego powiązania można zdefiniować klucz routingu. Jest to swego rodzaju identyfikator umożliwiający przekazanie wiadomości do określonej kolejki.
Przykładowo, jeśli mamy klucze routingu X, Y i Z, wiadomość z kluczem routingu Y trafi do kolejki Y, a następnie zostanie dostarczona do konsumenta, który został zdefiniowany jako odbiorca tej wiadomości.
W ten sposób, pomimo że do wymiany podłączonych jest kilka kolejek, każda z nich może mieć odmienną relację z wymianą, opartą na kluczach routingu.
Wymiana rozgłoszeniowa (Fanout)
W przypadku tego typu wymiany wiadomość jest przekazywana do wszystkich kolejek z nią połączonych. Oznacza to, że jeśli 10 kolejek jest podłączonych do wymiany rozgłoszeniowej, każda z nich otrzyma wysłaną wiadomość.
Wymiana tematyczna (Topic)
Jest to najbardziej elastyczny typ wymiany, umożliwiający wysyłanie wiadomości w oparciu o tematy. Wykorzystując odpowiednie nazewnictwo kluczy routingu, możemy tworzyć zaawansowane wzorce reguł i relacji pomiędzy poszczególnymi systemami.
Przykładowe klucze routingu: (x.*); (*.z); (*.y.*).
Czym jest AMQP w kontekście RabbitMQ?
AMQP (Advanced Message Queuing Protocol) to otwarty protokół umożliwiający przesyłanie wiadomości pomiędzy aplikacjami. Można go porównać do protokołów HTTP i TCP, ponieważ działa on jako protokół przewodowy, z tą różnicą, że umożliwia asynchroniczny transport wiadomości.
RabbitMQ zdecydowało się na implementację AMQP z kilku powodów. Przede wszystkim, protokół ten jest standardem dla oprogramowania pośredniczącego, w przeciwieństwie do JMS, który definiuje interfejs API.
Specyfikacja AMQP została opracowana przez międzynarodowe konsorcjum, w skład którego wchodzą duże firmy, takie jak Red Hat, Cisco Systems i Microsoft. Kolejnym istotnym aspektem jest interoperacyjność protokołu, dzięki której dowolna aplikacja implementująca AMQP może komunikować się z brokerem AMQP.
Warto zaznaczyć, że AMQP nie jest jedynym protokołem obsługiwanym przez RabbitMQ. Poniższa grafika przedstawia wszystkie protokoły, języki i interfejsy API, które są zaimplementowane i/lub wspierane przez RabbitMQ.
Najważniejsze zalety RabbitMQ
RabbitMQ, poza umożliwieniem integracji aplikacji poprzez asynchroniczną wymianę wiadomości niezależnie od ich lokalizacji, oferuje szereg funkcji, które przyczyniły się do jego popularności w świecie brokerów wiadomości:
Niezawodne przechowywanie
RabbitMQ oferuje mechanizmy zapewniające dostarczenie wiadomości. Przykładowo, wiadomości są przechowywane, gdy żaden z konsumentów nie może ich odebrać. Dodatkowo, konsumenci mogą potwierdzać odebranie wiadomości, co daje pewność, że wiadomość została poprawnie przetworzona.
W przypadku niepowodzenia w przetwarzaniu wiadomości, RabbitMQ umożliwia ponowne umieszczenie jej w kolejce, aby mogła zostać przetworzona przez inną instancję konsumenta lub ponownie przez tego samego konsumenta po odzyskaniu sprawności.
RabbitMQ gwarantuje również zachowanie kolejności dostarczania wiadomości – są one przetwarzane w tej samej kolejności, w jakiej dotarły do kolejki.
Klasteryzacja
Choć RabbitMQ zapewnia wysoką wydajność, przetwarzając tysiące komunikatów na sekundę, w pewnych sytuacjach może zajść potrzeba obsłużenia większej ilości wiadomości bez spadku wydajności aplikacji.
Aby sprostać tym wymaganiom, RabbitMQ umożliwia tworzenie klastrów, które skalują rozwiązanie w poziomie. Jest to proces transparentny zarówno dla producentów, jak i konsumentów.
Wysoka dostępność kolejek
W RabbitMQ kolejki mogą być replikowane w wielu węzłach w ramach klastra. Dzięki temu w przypadku awarii jednego z węzłów lub przestoju, broker nadal może odbierać wiadomości od producentów i dostarczać je do odpowiednich konsumentów.
Elastyczne routowanie
RabbitMQ oferuje możliwość definiowania elastycznych reguł routingu, które mogą być oparte na wzorcach. Dzięki temu można precyzyjnie kierować wiadomości pomiędzy wymianami i kolejkami za pośrednictwem powiązań.
Obsługa wielu protokołów
Oprócz protokołu AMQP, RabbitMQ, dzięki wtyczkom, obsługuje również protokoły STOMP, MQTT i HTTP. Ponadto, broker ten posiada mechanizmy uwierzytelniania i kontroli dostępu dla każdego z komponentów.
Praktyczne zastosowania RabbitMQ
Najważniejsze zastosowania RabbitMQ to zapewnienie asynchroniczności pomiędzy aplikacjami, redukcja zależności pomiędzy nimi, dystrybucja powiadomień oraz zarządzanie zadaniami w tle.
Konkretne przykłady zastosowań RabbitMQ można odnaleźć w sektorze e-commerce, gdzie platforma ta służy do zarządzania, przetwarzania i przekazywania informacji o zamówieniach do systemów obsługujących inne obszary, takie jak logistyka czy fakturowanie.
Podczas przetwarzania zamówienia, informacja o sprzedaży może być przekazana do centrum dystrybucji i działu księgowości. W takim scenariuszu, wszystko odbywa się asynchronicznie, ale jedna akcja może zostać przekazana do kilku kolejek.
W oparciu o powyższy przykład, taka funkcjonalność może być bardzo przydatna, gdy klient dokona zakupu, a produkt musi zostać przygotowany do wysyłki, przetransportowany i zafakturowany.
Ponieważ każdy z tych etapów obsługiwany jest przez odrębny system, zadaniem RabbitMQ jest przekazanie odpowiednich komunikatów do każdego z nich.
Alternatywy dla RabbitMQ:
RabbitMQ, pomimo swojej prostoty, ma kilka alternatyw. Oto niektóre z nich:
#1. IronMQ
IronMQ to bardzo szybkie oprogramowanie do kolejkowania wiadomości. Cechuje się wysoką dostępnością, trwałością i jest idealne do jednorazowego dostarczania komunikatów. IronMQ jest potężnym rozwiązaniem natywnym dla chmury, przeznaczonym dla nowoczesnych architektur aplikacji.
Obsługuje kolejki push, pull oraz long polling, umożliwiając długotrwałe otwieranie zapytań. Ponadto może korzystać z wielu centrów danych o wysokiej dostępności, co ułatwia skalowanie.
Może być wdrażane w chmurze, na współdzielonym lub dedykowanym sprzęcie, a także lokalnie. Oferuje także liczne biblioteki klienckie z przejrzystą dokumentacją.
#2. Apache Kafka
Kafka to platforma ciesząca się ugruntowaną pozycją w dziedzinie rozproszonego strumieniowania zdarzeń. W swojej istocie, Kafka została zaprojektowana jako replikowany, rozproszony, trwały dziennik zatwierdzeń.
Jej głównym zastosowaniem są mikrousługi oparte na zdarzeniach oraz aplikacje do przetwarzania strumieniowego na dużą skalę. Kafka automatycznie replikuje zdarzenia asynchronicznie w klastrze, co zapewnia odporność na awarie i wysoką dostępność.
#3. Apache ActiveMQ
ActiveMQ to wieloprotokołowy broker wiadomości oparty na języku Java. Umożliwia on integrację aplikacji za pomocą protokołu AMQP na poziomie warstwy aplikacji.
Implementuje wiele protokołów integracji, w tym JMS (natywne Java) i Stomp (które może być wykorzystane przez aplikacje PHP).
Amazon oferuje również swoją „zarządzaną” wersję ActiveMQ, nazywaną Amazon MQ, co znacznie ułatwia korzystanie z tej usługi.
Podsumowanie
Brokerzy wiadomości od dawna stanowią istotny element architektury systemów informatycznych. Wraz ze wzrostem liczby użytkowników korzystających z systemów firmowych różnymi kanałami, coraz większe znaczenie zyskują narzędzia, które umożliwiają skalowanie systemów w poziomie przy zachowaniu niskich kosztów oraz przetwarzanie ogromnej liczby wiadomości na sekundę.
W tym kontekście, nowa generacja brokerów, takich jak RabbitMQ, odgrywa coraz większą rolę w nowoczesnych aplikacjach. Pozwalają one na zapewnienie wysokiego poziomu dostępności, niezawodności, interoperacyjności i wydajności.
Warto również zapoznać się z ofertami niezawodnych platform hostingowych dla RabbitMQ.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.