Porównanie wiodących platform przesyłania wiadomości

Apache Kafka i RabbitMQ to dwa szeroko stosowane brokery wiadomości, które umożliwiają oddzielenie wymiany wiadomości między aplikacjami. Jakie są ich najważniejsze cechy i czym się od siebie różnią? Przejdźmy do pojęć.

KrólikMQ

RabbitMQ to aplikacja brokera wiadomości typu open source do komunikacji i wymiany wiadomości między stronami. Ponieważ został opracowany w Erlang, jest bardzo lekki i wydajny. Język Erlang został opracowany przez firmę Ericson z naciskiem na systemy rozproszone.

Jest uważany za bardziej tradycyjnego brokera wiadomości. Opiera się na schemacie wydawca-subskrybent, choć może traktować komunikację synchronicznie lub asynchronicznie, w zależności od tego, co jest ustawione w konfiguracji. Zapewnia również dostarczanie i porządkowanie wiadomości między producentami a konsumentami.

Obsługuje protokoły AMQP, STOMP, MQTT, HTTP i gniazda sieciowe. Trzy modele wymiany wiadomości: tematyczny, fanout i bezpośredni:

  • Bezpośrednia i indywidualna wymiana według tematu lub tematu [topic]
  • Wszyscy konsumenci podłączeni do kolejki otrzymują [fanout] wiadomość
  • Każdy konsument otrzymuje wysłaną wiadomość [direct]

Oto składniki RabbitMQ:

Producenci

Producenci to aplikacje, które tworzą i wysyłają wiadomości do RabbitMQ. Może to być dowolna aplikacja, która może łączyć się z RabbitMQ i publikować wiadomości.

Konsumenci

Konsumenci to aplikacje, które odbierają i przetwarzają komunikaty z RabbitMQ. Może to być dowolna aplikacja, która może łączyć się z RabbitMQ i subskrybować wiadomości.

Wymiany

Giełdy odpowiadają za odbieranie komunikatów od producentów i kierowanie ich do odpowiednich kolejek. Istnieje kilka rodzajów wymiany, w tym wymiana bezpośrednia, fanout, temat i wymiana nagłówków, z których każda ma własne reguły routingu.

Kolejki

Kolejki to miejsce, w którym wiadomości są przechowywane, dopóki nie zostaną wykorzystane przez konsumentów. Są tworzone przez aplikacje lub automatycznie przez RabbitMQ, gdy wiadomość jest publikowana na giełdzie.

Wiązania

Powiązania definiują relacje między giełdami i kolejkami. Określają reguły kierowania wiadomości, które są używane przez giełdy do kierowania wiadomości do odpowiednich kolejek.

Architektura RabbitMQ

RabbitMQ używa modelu ściągania do dostarczania wiadomości. W tym modelu konsumenci aktywnie żądają wiadomości od brokera. Komunikaty są publikowane na giełdach odpowiedzialnych za kierowanie komunikatów do odpowiednich kolejek na podstawie kluczy routingu.

Architektura RabbitMQ jest oparta na architekturze klient-serwer i składa się z kilku komponentów, które współpracują ze sobą, aby zapewnić niezawodną i skalowalną platformę do przesyłania wiadomości. Koncepcja AMQP przewiduje komponenty Exchanges, Queues, Bindings oraz Publishers i Subscribers. Wydawcy publikują wiadomości na giełdach.

Giełdy pobierają te wiadomości i rozprowadzają je do kolejek od 0 do n w oparciu o określone reguły (powiązania). Wiadomości przechowywane w kolejkach mogą być następnie pobierane przez konsumentów. W uproszczonej formie zarządzanie wiadomościami odbywa się w RabbitMQ w następujący sposób:

Źródło obrazu: VMware

  • Wydawcy wysyłają wiadomości do wymiany;
  • Exchange wysyła wiadomości do kolejek i innych giełd;
  • Po otrzymaniu wiadomości RabbitMQ wysyła potwierdzenia do nadawców;
  • Konsumenci utrzymują trwałe połączenia TCP z RabbitMQ i deklarują, którą kolejkę otrzymują;
  • RabbitMQ kieruje wiadomości do konsumentów;
  • Konsumenci wysyłają potwierdzenia otrzymania wiadomości o powodzeniu lub błędzie;
  • Po pomyślnym odebraniu wiadomość jest usuwana z kolejki.

Apache Kafka

Apache Kafka to rozproszone rozwiązanie do przesyłania wiadomości typu open source opracowane przez LinkedIn w Scali. Jest w stanie przetwarzać wiadomości i przechowywać je w modelu wydawca-subskrybent o wysokiej skalowalności i wydajności.

Aby przechowywać otrzymane zdarzenia lub komunikaty, należy rozdzielić tematy między węzły za pomocą partycji. Łączy w sobie wzorce wydawcy-subskrybenta i kolejki komunikatów, a także odpowiada za zapewnienie kolejności komunikatów dla każdego konsumenta.

Kafka specjalizuje się w wysokiej przepustowości danych i małych opóźnieniach w obsłudze strumieni danych w czasie rzeczywistym. Osiąga się to poprzez unikanie zbyt dużej logiki po stronie serwera (brokera), a także niektórych specjalnych szczegółów implementacji.

Na przykład Kafka w ogóle nie używa pamięci RAM i natychmiast zapisuje dane w systemie plików serwera. Ponieważ wszystkie dane są zapisywane sekwencyjnie, osiągana jest wydajność odczytu i zapisu porównywalna z pamięcią RAM.

Oto główne koncepcje Kafki, które czynią ją skalowalną, wydajną i odporną na błędy:

Temat

Temat to sposób oznaczania lub kategoryzowania wiadomości; wyobraź sobie szafę z 10 szufladami; każda szuflada może być tematem, a szafą jest platforma Apache Kafka, więc oprócz kategoryzowania grupowania wiadomości, inna lepsza analogia dotycząca tematu byłaby umieszczana w relacyjnych bazach danych.

Producent

Producent lub producent to ten, który łączy się z platformą przesyłania wiadomości i wysyła jedną lub więcej wiadomości na określony temat.

Konsument

Konsument to osoba, która łączy się z platformą przesyłania wiadomości i odbiera jedną lub więcej wiadomości na określony temat.

Pośrednik

Koncepcja brokera w platformie Kafka to nic innego jak praktycznie sama Kafka, a to on zarządza tematami i definiuje sposób przechowywania komunikatów, logów itp.

Grupa

Klaster to zestaw brokerów, którzy komunikują się ze sobą lub nie w celu uzyskania lepszej skalowalności i odporności na awarie.

Plik dziennika

Każdy temat przechowuje swoje rekordy w formacie dziennika, czyli w uporządkowany i sekwencyjny sposób; plik dziennika jest zatem plikiem zawierającym informacje na dany temat.

Przegrody

Partycje to warstwa partycji wiadomości w temacie; to partycjonowanie zapewnia elastyczność, odporność na błędy i skalowalność Apache Kafka, dzięki czemu każdy temat może mieć wiele partycji w różnych lokalizacjach.

Architektura Apache Kafki

Kafka jest oparta na modelu push dostarczania wiadomości. Korzystając z tego modelu, wiadomości w Kafce są aktywnie wypychane do konsumentów. Komunikaty są publikowane w tematach, które są podzielone na partycje i dystrybuowane do różnych brokerów w klastrze.

Konsumenci mogą następnie subskrybować jeden lub więcej tematów i otrzymywać wiadomości w miarę ich tworzenia na te tematy.

W Kafce każdy temat jest podzielony na jedną lub więcej partycji. To na partycji kończą się wydarzenia.

Jeśli w klastrze jest więcej niż jeden broker, wówczas partycje zostaną rozłożone równomiernie na wszystkich brokerów (w miarę możliwości), co pozwoli na skalowanie obciążenia zapisem i odczytem w jednym temacie do kilku brokerów jednocześnie. Ponieważ jest to klaster, działa przy użyciu ZooKeeper do synchronizacji.

Przyjmuje sklepy i dystrybuuje płyty. Rekord to dane generowane przez jakiś węzeł systemu, którym może być zdarzenie lub informacja. Jest wysyłany do klastra, a klaster przechowuje go w partycji tematu.

Każdy rekord ma przesunięcie sekwencji, a konsument może kontrolować przesunięcie, którego używa. Tak więc, jeśli istnieje potrzeba ponownego przetworzenia tematu, można to zrobić w oparciu o offset.

Źródło obrazu: Wikipedia

Logika, taka jak zarządzanie ostatnim odczytanym identyfikatorem wiadomości konsumenta czy decyzja, do której partycji mają być zapisywane nowo napływające dane, jest całkowicie przeniesiona na klienta (producenta lub konsumenta).

Oprócz koncepcji producenta i konsumenta istnieją również koncepcje tematu, partycji i replikacji.

Temat opisuje kategorię wiadomości. Kafka osiąga odporność na awarie, replikując dane w temacie i skalując, dzieląc temat na wiele serwerów.

RabbitMQ kontra Kafka

Główne różnice między Apache Kafka a RabbitMQ wynikają z zasadniczo różnych modeli dostarczania wiadomości zaimplementowanych w tych systemach.

W szczególności Apache Kafka działa na zasadzie pull (pull), gdy sami konsumenci otrzymują potrzebne im wiadomości z tematu.

Z kolei RabbitMQ realizuje model push, wysyłając niezbędne komunikaty do odbiorców. W związku z tym Kafka różni się od RabbitMQ w następujący sposób:

# 1. Architektura

Jedną z największych różnic między RabbitMQ a Kafką jest różnica w architekturze. RabbitMQ wykorzystuje tradycyjną architekturę kolejek komunikatów opartą na brokerze, podczas gdy Kafka wykorzystuje architekturę rozproszonej platformy strumieniowej.

Ponadto RabbitMQ używa modelu dostarczania wiadomości opartego na ściąganiu, podczas gdy Kafka używa modelu opartego na wypychaniu.

#2. Zapisywanie wiadomości

RabbitMQ umieszcza wiadomość w kolejce FIFO (First Input – First Output) i monitoruje stan tej wiadomości w kolejce, a Kafka dodaje wiadomość do logu (zapisuje na dysk), pozostawiając odbiornikowi samo zajęcie się uzyskaniem niezbędnych informacje z tematu.

RabbitMQ usuwa wiadomość po dostarczeniu jej do odbiorcy, podczas gdy Kafka przechowuje wiadomość do czasu, aż zostanie zaplanowane wyczyszczenie dziennika.

W ten sposób Kafka zapisuje obecny i wszystkie poprzednie stany systemu i może służyć jako wiarygodne źródło danych historycznych, w przeciwieństwie do RabbitMQ.

#3. Równoważenie obciążenia

Dzięki modelowi pull dostarczania wiadomości RabbitMQ zmniejsza opóźnienia. Jednak adresaci mogą zostać przepełnieni, jeśli wiadomości docierają do kolejki szybciej, niż są w stanie je przetworzyć.

Ponieważ w RabbitMQ każdy odbiorca żąda/przesyła inną liczbę wiadomości, podział pracy może stać się nierówny, co spowoduje opóźnienia i utratę kolejności wiadomości podczas przetwarzania.

Aby temu zapobiec, każdy odbiornik RabbitMQ konfiguruje limit pobierania wstępnego, limit liczby skumulowanych niepotwierdzonych wiadomości. W Kafce równoważenie obciążenia odbywa się automatycznie poprzez redystrybucję odbiorców między sekcjami (partycjami) tematu.

#4. Rozgromienie

RabbitMQ zawiera cztery sposoby kierowania do różnych giełd w celu kolejkowania, co pozwala na potężny i elastyczny zestaw wzorców przesyłania wiadomości. Kafka implementuje tylko jeden sposób zapisywania wiadomości na dysku bez routingu.

#5. Zamawianie wiadomości

RabbitMQ pozwala zachować względny porządek w dowolnych zestawach (grupach) zdarzeń, a Apache Kafka zapewnia łatwy sposób utrzymania porządku ze skalowalnością poprzez sekwencyjne zapisywanie komunikatów do zreplikowanego dziennika (tematu).

FeatureRabbitMQKafka ArchitectureZapisuje wiadomości na dysku dołączonym do brokeraArchitektura rozproszonej platformy streamingowejModel dostarczaniaPull basedPush basedZapisywanie wiadomościNie może zapisywać wiadomościUtrzymuje zamówienia poprzez pisanie do tematu Load BalancingKonfiguruje limit pobierania z wyprzedzeniemWykonywane automatycznie RoutingObejmuje 4 sposoby trasowaniaMa tylko 1 sposób trasowania wiadomościZamawianie wiadomościPozwala zachować porządek w grupachUtrzymuje zamówienia poprzez pisanie do tematu Procesy zewnętrzne Nie wymaga Wymaga uruchomionej instancji Zookeeper WtyczkiKilka wtyczek Ma ograniczoną obsługę wtyczek

RabbitMQ i Kafka to szeroko stosowane systemy przesyłania wiadomości, z których każdy ma swoje mocne strony i przypadki użycia. RabbitMQ to elastyczny, niezawodny i skalowalny system przesyłania wiadomości, który doskonale radzi sobie z kolejkowaniem wiadomości, co czyni go idealnym wyborem dla aplikacji wymagających niezawodnego i elastycznego dostarczania wiadomości.

Z drugiej strony Kafka jest rozproszoną platformą strumieniową zaprojektowaną do wysokoprzepustowego przetwarzania dużych ilości danych w czasie rzeczywistym, co czyni ją doskonałym wyborem dla aplikacji wymagających przetwarzania i analizy danych w czasie rzeczywistym.

Główne przypadki użycia dla RabbitMQ:

e-commerce

RabbitMQ jest używany w aplikacjach e-commerce do zarządzania przepływem danych między różnymi systemami, takimi jak zarządzanie zapasami, przetwarzanie zamówień i przetwarzanie płatności. Może obsłużyć duże ilości wiadomości i zapewnić, że są one dostarczane niezawodnie i we właściwej kolejności.

Opieka zdrowotna

W branży opieki zdrowotnej RabbitMQ służy do wymiany danych między różnymi systemami, takimi jak elektroniczna dokumentacja medyczna (EHR), urządzenia medyczne i systemy wspomagania decyzji klinicznych. Może pomóc w poprawie opieki nad pacjentem i zmniejszeniu liczby błędów, zapewniając dostępność właściwych informacji we właściwym czasie.

Usługi finansowe

RabbitMQ umożliwia przesyłanie wiadomości w czasie rzeczywistym między systemami, takimi jak platformy transakcyjne, systemy zarządzania ryzykiem i bramki płatnicze. Może pomóc zapewnić szybkie i bezpieczne przetwarzanie transakcji.

systemy IoT

RabbitMQ jest używany w systemach IoT do zarządzania przepływem danych między różnymi urządzeniami i czujnikami. Może pomóc zapewnić bezpieczne i wydajne dostarczanie danych, nawet w środowiskach o ograniczonej przepustowości i przerywanej łączności.

Kafka to rozproszona platforma do przesyłania strumieniowego zaprojektowana do obsługi dużych ilości danych w czasie rzeczywistym.

Główne przypadki użycia Kafki

Analizy w czasie rzeczywistym

Kafka jest używana w aplikacjach analitycznych w czasie rzeczywistym do przetwarzania i analizowania danych w miarę ich generowania, umożliwiając firmom podejmowanie decyzji na podstawie aktualnych informacji. Może obsługiwać duże ilości danych i skalować, aby zaspokoić potrzeby nawet najbardziej wymagających aplikacji.

Agregacja dzienników

Kafka może agregować dzienniki z różnych systemów i aplikacji, umożliwiając firmom monitorowanie i rozwiązywanie problemów w czasie rzeczywistym. Może być również używany do przechowywania dzienników do długoterminowej analizy i raportowania.

Nauczanie maszynowe

Kafka jest wykorzystywana w aplikacjach uczenia maszynowego do strumieniowego przesyłania danych do modeli w czasie rzeczywistym, umożliwiając firmom dokonywanie prognoz i podejmowanie działań w oparciu o aktualne informacje. Może pomóc poprawić dokładność i skuteczność modeli uczenia maszynowego.

Moja opinia na temat RabbitMQ i Kafki

Wadą szerokich i zróżnicowanych możliwości RabbitMQ w zakresie elastycznego zarządzania kolejkami komunikatów jest zwiększone zużycie zasobów, a co za tym idzie spadek wydajności przy zwiększonym obciążeniu. Ponieważ jest to tryb działania dla złożonych systemów, w większości przypadków Apache Kafka jest najlepszym narzędziem do zarządzania wiadomościami.

Np. w przypadku zbierania i agregowania wielu zdarzeń z dziesiątek systemów i serwisów z uwzględnieniem ich georezerwacji, metryk klienta, plików logów i analityki, z perspektywą powiększania się źródeł informacji, będę preferował wykorzystanie Kafki, jeśli jednak jesteś w sytuacji, w której potrzebujesz tylko szybkiego przesyłania wiadomości, RabbitMQ wykona zadanie dobrze!

Możesz także przeczytać, jak zainstalować Apache Kafka w systemach Windows i Linux.