6 najlepszych systemów kolejkowych dla programistów zaplecza

Szukasz systemu kolejkowego? A może szukasz lepszego? Oto wszystkie potrzebne informacje!

Systemy kolejkowe to najlepiej strzeżona tajemnica rozwoju backendu.

Nie próbując napisać wiersza chwalącego systemy kolejkowe, powiedziałbym, że młodszy backend developer staje się backend developerem średniego poziomu po tym, jak nauczy się integrować kolejki z systemem. Kolejki poprawiają doświadczenie klienta (zobaczymy jak), zmniejszają złożoność i poprawiają niezawodność systemu.

Oczywiście, w przypadku bardzo prostych aplikacji internetowych z prawie zerowym ruchem i witrynami z broszurami kolejki mogą być ogólnie (lub nawet niemożliwe do zainstalowania, jeśli korzystasz z typowego środowiska hostingu współdzielonego), ale nietrywialne aplikacje zyskają na kolejkach systemy i duże aplikacje są niemożliwe bez kolejki.

Zanim zaczniemy, zastrzeżenie: jeśli znasz już systemy kolejkowe i chcesz porównać różne opcje, kilka następnych części wprowadzających spowoduje duży sen. 🙂 Nie krępuj się więc skakać do przodu. Sekcje wprowadzające są przeznaczone dla tych, którzy mają tylko mglisty pomysł na systemy kolejkowe lub po prostu słyszeli tę nazwę mimochodem.

Co to jest system kolejkowy?

Zacznijmy od zrozumienia, czym jest kolejka.

Kolejka to struktura danych w informatyce, która naśladuje, no cóż, kolejki świata rzeczywistego, które widzimy wokół nas. Jeśli pójdziesz na przykład do kasy biletowej, zauważysz, że będziesz musiał stanąć na końcu kolejki, podczas gdy osoba na początku kolejki dostanie bilet pierwsza. To właśnie nazywamy zjawiskiem „kto pierwszy, ten lepszy”. W informatyce możliwe jest pisanie programów, które przechowują takie zadania w kolejce, przetwarzając je jeden po drugim na tej samej zasadzie „kto pierwszy, ten lepszy”.

Zwróć uwagę, że kolejka sama nie wykonuje żadnego przetwarzania. Jest to po prostu tymczasowe przechowywanie, w którym zadania czekają, aż coś ich zabierze. Jeśli to wszystko brzmi zbyt abstrakcyjnie, nie martw się. Jest to pojęcie abstrakcyjne, ale w następnej sekcji zobaczymy jasne przykłady.

Dlaczego potrzebujesz systemów kolejkowych?

Bez wchodzenia w bardzo długi opis, powiedziałbym, że główną potrzebą systemów kolejkowania jest przetwarzanie w tle, wykonywanie równoległe i odzyskiwanie po awarii. Spójrzmy na to za pomocą przykładów:

Przetwarzanie w tle

Załóżmy, że prowadzisz kampanię marketingową e-commerce, w której liczy się czas, a Twoja aplikacja jest tak zbudowana, że ​​wysyła wiadomość e-mail z potwierdzeniem tuż przed zakończeniem płatności przez klienta i wyświetleniem strony z podziękowaniem. Jeśli serwer poczty, z którym się łączysz, nie działa, strona internetowa po prostu umrze, zakłócając komfort użytkowania.

Wyobraź sobie dużą liczbę próśb o wsparcie, które otrzymasz! W takim przypadku lepiej przekazać to zadanie wysyłania e-maili do kolejki zadań i pokazać klientowi stronę sukcesu.

Wykonanie równoległe

Wielu programistów, zwłaszcza tych, którzy w większości kodują prostsze aplikacje o małym ruchu, ma zwyczaj używania zadań cron do przetwarzania w tle. Jest to w porządku, dopóki rozmiar danych wejściowych nie stanie się tak duży, że nie można go wyczyścić. Załóżmy na przykład, że masz zadanie crona, które kompiluje raporty analityczne i wysyła je pocztą e-mail do użytkowników, a Twój system może przetwarzać 100 raportów na minutę.

Gdy tylko Twoja aplikacja się rozrośnie i zacznie otrzymywać średnio ponad 100 żądań na minutę, zacznie coraz bardziej pozostawać w tyle i nigdy nie będzie w stanie wykonać wszystkich zadań.

W systemie kolejkowym takiej sytuacji można uniknąć, konfigurując wielu pracowników, z których każdy może wybrać zadanie (zawierające 100 raportów do wykonania każdy) i pracować równolegle, aby zakończyć zadanie znacznie szybciej.

Odzyskiwanie po awarii

Generalnie nie myślimy o porażkach jako twórcy stron internetowych. Przyjmujemy za pewnik, że nasze serwery i używane przez nas interfejsy API będą zawsze dostępne online. Ale rzeczywistość jest inna — awarie sieci są zbyt częste, a doskonałe interfejsy API, na których polegasz, mogą nie działać z powodu problemów z infrastrukturą (zanim powiesz „nie ja!”, nie zapomnij ogromna awaria Amazon S3). Wracając więc do przykładu raportowania, jeśli część generowania raportu wymaga połączenia z Payment API i połączenie to nie działa przez 2 minuty, co dzieje się z 200 raportami, które się nie powiodły?

Systemy kolejkowe wiążą się jednak ze znacznym obciążeniem. Krzywa uczenia się jest dość stroma, gdy wchodzisz do zupełnie nowej domeny, wzrasta złożoność aplikacji i wdrożenia, a zadania w kolejce nie zawsze mogą być kontrolowane ze 100% precyzją. To powiedziawszy, zdarzają się sytuacje, w których budowanie aplikacji bez kolejek jest po prostu niemożliwe.

Pomijając to, przyjrzyjmy się niektórym typowym opcjom wśród zapleczy/systemów kolejkowania.

Redis

Redis jest znany jako magazyn klucz-wartość, który przechowuje, aktualizuje i pobiera ciągi danych bez znajomości struktury danych. Chociaż mogło to być prawdą wcześniej, dziś Redis ma wydajne i bardzo przydatne struktury danych, takie jak listy, posortowane zestawy, a nawet system Pub-Sub, co czyni go wysoce pożądanym w implementacjach kolejkowych.

Zalety Redis to:

  • Całkowicie w pamięci bazy danych, co skutkuje szybszym odczytem/zapisem.
  • Wysoka wydajność: może z łatwością obsługiwać ponad 100 000 operacji odczytu/zapisu na sekundę.
  • Wysoce elastyczny schemat trwałości. Możesz wybrać maksymalną wydajność kosztem możliwej utraty danych w przypadku awarii lub skonfigurować w pełni konserwatywny tryb, aby poświęcić wydajność na rzecz spójności.
  • Klastry obsługiwane po wyjęciu z pudełka

Pamiętaj, że Redis nie ma żadnych abstrakcji przesyłania wiadomości/kolejkowania/odzyskiwania, więc musisz albo użyć pakietu, albo samodzielnie zbudować lekki system. Przykładem jest to, że Redis jest domyślnym backendem kolejki dla frameworka Laravel PHP, w którym harmonogram został zaimplementowany przez autorów frameworka.

Nauka Redis jest proste.

KrólikMQ

Istnieje kilka subtelnych różnic między Redis a KrólikMQwięc najpierw usuńmy je z drogi.

Przede wszystkim RabbitMQ ma bardziej wyspecjalizowaną, dobrze zdefiniowaną rolę, a więc zbudowaną tak, aby to odzwierciedlać — przesyłanie wiadomości. Innymi słowy, jego słodkim punktem jest działanie jako pośrednik między dwoma systemami, co nie ma miejsca w przypadku Redis, który działa jak baza danych. W rezultacie RabbitMQ zapewnia kilka dodatkowych udogodnień, których brakuje w Redis: routing wiadomości, ponawianie prób, dystrybucja obciążenia itp.

Jeśli się nad tym zastanowić, kolejki zadań można również traktować jako system przesyłania wiadomości, w którym harmonogram, pracownicy i „przesyłający” zadania mogą być postrzegani jako podmioty uczestniczące w przekazywaniu wiadomości.

RabbitMQ ma następujące zalety:

  • Lepsze abstrakcje do przekazywania wiadomości, redukujące pracę na poziomie aplikacji, jeśli przekazywanie wiadomości jest tym, czego potrzebujesz.
  • Bardziej odporny na awarie zasilania i przerwy w dostawie prądu (przynajmniej domyślnie niż Redis).
  • Obsługa klastrów i federacji dla wdrożeń rozproszonych.
  • Przydatne narzędzia do zarządzania i monitorowania wdrożeń.
  • Obsługa praktycznie wszystkich nietrywialnych języków programowania.
  • Wdrożenie za pomocą wybranego narzędzia (Docker, Chef, Puppet itp.).

Kiedy stosować RabbitMQ? Powiedziałbym, że to świetny wybór, gdy wiesz, że musisz użyć asynchronicznego przekazywania wiadomości, ale nie jesteś gotowy, aby poradzić sobie z ogromną złożonością niektórych innych opcji kolejkowania na tej liście (patrz poniżej).

AktywnyMQ

Jeśli interesujesz się przestrzenią korporacyjną (lub tworzysz wysoce rozproszoną i wielkoskalową aplikację) i nie chcesz ciągle wymyślać koła na nowo (i popełniać błędów po drodze), AktywnyMQ warto zajrzeć.

Oto, gdzie wyróżnia się ActiveMQ:

  • Jest zaimplementowany w Javie, dzięki czemu ma naprawdę zgrabną integrację z Javą (zgodny ze standardem JMS).
  • Obsługa wielu protokołów: AMQP, MQTT, STOMP, OpenWire itp.
  • Zajmuje się bezpieczeństwem, routingiem, wygaśnięciem wiadomości, analityką itp. po wyjęciu z pudełka.
  • Wbudowana obsługa popularnych wzorców wiadomości rozproszonych, oszczędzająca czas i kosztowne błędy.

Nie oznacza to, że ActiveMQ jest dostępne tylko dla Javy. Ma klientów dla Pythona, C/C++, Node, .Net i innych ekosystemów, więc nie powinno być obaw o możliwy upadek w przyszłości. Poza tym ActiveMQ jest zbudowany na całkowicie otwartych standardach, a budowanie własnych lekkich klientów powinno być łatwe.

Wszystko, co zostało powiedziane i zrobione, pamiętaj, że ActiveMQ jest tylko brokerem i nie zawiera zaplecza. Nadal będziesz musiał używać jednego z obsługiwanych zapleczy do przechowywania wiadomości. Umieściłem go tutaj, ponieważ nie jest powiązany z konkretnym językiem programowania (jak inne popularne rozwiązania, takie jak Celery, Sidekiq itp.)

Amazon MQ

Amazon MQ zasługuje na szybką, ale ważną wzmiankę. Jeśli uważasz, że ActiveMQ jest idealnym rozwiązaniem dla Twoich potrzeb, ale nie chcesz samodzielnie zajmować się budowaniem i utrzymywaniem infrastruktury, Amazon MQ oferuje w tym celu usługę zarządzaną. Obsługuje wszystkie protokoły, które obsługuje ActiveMQ — nie ma żadnej różnicy w funkcjach — ponieważ używa samego ActiveMQ pod powierzchnią.

Zaletą jest to, że jest to usługa zarządzana, więc nie musisz się martwić o nic innego niż korzystanie z niej. Ma to jeszcze większy sens w przypadku wdrożeń, które są w AWS, ponieważ możesz korzystać z innych usług i ofert bezpośrednio z poziomu wdrożenia (na przykład szybsze przesyłanie danych).

Amazon SQS

Nie możemy oczekiwać, że Amazon będzie siedział cicho, jeśli chodzi o krytyczne elementy infrastruktury, prawda?

I tak mamy Amazon SQS, który jest w pełni hostowaną, prostą usługą kolejkową (dosłownie) przez znanego giganta AWS. Po raz kolejny ważne są subtelne różnice, więc pamiętaj, że SQS nie ma koncepcji przekazywania wiadomości. Podobnie jak Redis, jest to prosty backend do przyjmowania i dystrybucji zadań w kolejkach.

Kiedy więc chcesz korzystać z Amazon SQS? Oto kilka powodów:

  • Jesteś fanem AWS i nie tkniesz niczego więcej (szczerze, jest wielu takich ludzi i myślę, że nie ma w tym nic złego).
  • Potrzebujesz rozwiązania hostowanego, więc upewnij się, że wskaźnik niepowodzeń wynosi zero i żadne z zadań nie zostanie utracone.
  • Nie chcesz budować klastra i musisz sam go monitorować. Albo, co gorsza, musisz zbudować narzędzia do monitorowania, kiedy możesz wykorzystać ten czas na produktywny rozwój.
  • Masz już znaczne inwestycje w platformę AWS, a bycie zamkniętym ma sens biznesowy.
  • Potrzebujesz skoncentrowanego, prostego systemu kolejkowania bez zbędnego zamieszania związanego z przekazywaniem wiadomości, protokołami i tak dalej.

Podsumowując, Amazon SQS to solidny wybór dla każdego, kto chce włączyć kolejki zadań do swojego systemu i nie musi martwić się o samodzielne instalowanie/monitorowanie rzeczy.

Łodyga fasoli

Łodyga fasoli istnieje od dłuższego czasu i jest sprawdzonym w boju, szybkim i łatwym zapleczem do kolejkowania zadań. Istnieje kilka cech Beanstalkd, które znacznie różnią go od Redis:

  • To system kolejki zadań i nic więcej. Popychasz do tego miejsca pracy, które później są przyciągane przez pracowników. Więc jeśli Twoja aplikacja ma nawet niewielką potrzebę przekazywania wiadomości, chcesz uniknąć Beanstalkd.
  • Nie ma zaawansowanych struktur danych, takich jak zestawy, kolejki priorytetowe itp.
  • Beanstalkd to tak zwana kolejka First In, First Out (FIFO). Nie ma możliwości uporządkowania zadań według priorytetów.
  • Nie ma opcji klastrowania.

Wszystko to powiedziawszy, Beanstalkd tworzy zgrabny i szybki system kolejkowania dla prostych projektów, które działają na jednym serwerze. Dla wielu jest szybszy i bardziej stabilny niż Redis. Więc jeśli masz zagadnienia z Redis, którego po prostu nie możesz rozwiązać bez względu na wszystko, a Twoje potrzeby są proste, warto spróbować Beanstalkd.

Wniosek

Jeśli przeczytałeś tak daleko (lub dotarłeś tutaj do czytania przeglądowego 😉 ), jest całkiem spora szansa, że ​​jesteś zainteresowany systemami kolejkowania lub ich potrzebujesz. Jeśli tak, lista na tej stronie będzie ci dobrze służyć, chyba że szukasz systemu kolejkowego specyficznego dla języka/frameworka.

Chciałbym móc powiedzieć, że kolejkowanie jest proste i w 100% niezawodne, ale tak nie jest. Jest bałagan, a ponieważ wszystko jest w tle i dzieje się bardzo szybko (błędy mogą pozostać niezauważone i stać się bardzo kosztowne). Mimo to kolejki są bardzo potrzebne poza pewnym punktem, a przekonasz się, że są potężną bronią (może nawet najpotężniejszą) w twoim arsenale. Powodzenia!