RabbitMQ. Część 1. Wprowadzenie. Erlang, AMQP

Dzień dobry, Habr! Chcę podzielić się przewodnikiem instruktażowym, który udało mi się stworzyć na podstawie RabbitMQ i skompresować w krótkie rekomendacje oraz wnioski.

Spis treści

  • RabbitMQ. Część 1. Wprowadzenie. Erlang, AMQP i RPC
  • RabbitMQ. Część 2. Zgłębiamy temat Exchanges
  • RabbitMQ. Część 3. Zrozumienie kolejek i powiązań
  • RabbitMQ. Część 4. Zrozumienie, czym są wiadomości i ramki
  • RabbitMQ. Część 5. Wydajność publikacji i konsumpcji wiadomości
  • RabbitMQ. Część 6. Przegląd modułów Federation i Shovel
  • RabbitMQ. Część 7. Szczegółowe informacje na temat połączenia i kanału
  • RabbitMQ. Część 8. RabbitMQ w .NET
  • RabbitMQ. Część 9. Monitorowanie

Krótko o AMQP

AMQP (Advanced Message Queuing Protocol) — otwarty protokół do przesyłania wiadomości między komponentami systemu. Główna idea polega na tym, że poszczególne podsystemy (lub niezależne aplikacje) mogą wymieniać wiadomości w dowolny sposób przez broker AMQP, który realizuje routowanie, może gwarantować dostawę, rozdzielanie strumieni danych, subskrypcję na potrzebne typy wiadomości.

Protokół AMQP wprowadza trzy pojęcia:

RabbitMQ. Część 1. Wprowadzenie. Erlang, AMQP

  • exchange (punkt wymiany lub wymiana) — tutaj wysyłane są wiadomości. Punkt wymiany rozdziela wiadomości do jednej lub kilku kolejek. On routuje wiadomości do kolejki na podstawie utworzonych powiązań (binding) między nim a kolejką
  • queue (kolejka) — struktura danych na dysku lub w pamięci operacyjnej, która przechowuje odnośniki do wiadomości i zwraca kopie wiadomości consumers (konsumentów)
  • binding (powiązanie) — zasada, która informuje punkt wymiany, do której z kolejek te wiadomości powinny trafić

Protokół działa na poziomie TCP/IP.

Krótko o Erlang

Kod źródłowy projektu znajduje się w repozytorium na GitHub. Architektura RabbitMQ-server opiera się na Erlang i BEAM.

Erlang został opracowany przez firmę Ericsson w połowie lat 80. jako rozproszony, odporny na awarie system czasu rzeczywistego dla aplikacji wymagających niezawodności pracy na poziomie 99,999%. Erlang jest stosowany w różnych branżach i nowoczesnych zastosowaniach, na przykład w WhatsApp. Więcej można przeczytać w artykule architektura WhatsApp, który Facebook kupił za 19 miliardów dolarów

Krótko o RabbitMQ

RabbitMQ – to broker wiadomości z otwartym kodem źródłowym. On routuje wiadomości zgodnie z wszystkimi podstawowymi zasadami protokołu AMQP opisanego w specyfikacji. RabbitMQ wdraża i uzupełnia protokół AMQP.

Główna idea modelu wymiany wiadomości w RabbitMQ polega na tym, że producer (wydawca) nie wysyła wiadomości bezpośrednio do kolejki. W rzeczywistości i dość często wydawca nawet nie wie, czy wiadomość w ogóle zostanie dostarczona do jakiejkolwiek kolejki.

Zamiast tego wydawca może wysyłać wiadomości tylko do wymiany. Z jednej strony wymiana otrzymuje wiadomości od wydawców, a z drugiej - wysyła je do kolejek. Wymiana musi dokładnie wiedzieć, co zrobić z otrzymaną wiadomością. Czy powinna ona być dodana do określonej kolejki? Czy powinna być dodana do kilku kolejek? Czy wiadomość należy zignorować?

RabbitMQ. Część 1. Wprowadzenie. Erlang, AMQP

Krótko pracę RabbitMQ można opisać w następujący sposób:

  1. Wydawca wysyła wiadomość do określonej wymiany
  2. Wymiana, otrzymując wiadomość, kieruje ją do jednej lub kilku kolejek zgodnie z zasadami powiązania między nią a kolejką
  3. Kolejka przechowuje odnośnik do tej wiadomości. Sama wiadomość jest przechowywana w pamięci operacyjnej lub na dysku
  4. Gdy tylko konsument jest gotowy do odebrania wiadomości z kolejki, serwer tworzy kopię wiadomości za pomocą odnośnika i ją wysyła
  5. Konsument odbiera wiadomość i wysyła do brokera potwierdzenie
  6. Broker, otrzymując potwierdzenie, usuwa kopię wiadomości z kolejki. Następnie usuwa ją z pamięci operacyjnej i dysku

RPC

Proces RPC (zdalne wywołanie procedury) leży u podstaw praktycznie wszystkich interakcji z rdzeniem RabbitMQ. Na przykład wstępne dyskusje warunków klienta z RabbitMQ, demonstruje pewien proces RPC. Gdy ta sekwencja się zakończy, RabbitMQ będzie gotowy do przyjmowania żądań od klienta:

RabbitMQ. Część 1. Wprowadzenie. Erlang, AMQP

Także w specyfikacji AMQP zarówno klient, jak i serwer mogą wywoływać polecenia. To oznacza, że klient oczekuje interakcji z serwerem. Polecenia to klasy i metody. Na przykład, Connection.Start – wywołanie metody Rozpocznij klasy Connection.

Połączenie i kanały

Do takiej wymiany informacji między klientem a serwerem używane są kanały. Kanały są tworzone w ramach określonego połączenia. Każdy kanał jest izolowany od innych kanałów. W przypadku synchronicznym nie można wykonać kolejnej komendy, dopóki nie otrzymamy odpowiedzi.

Aby móc wysyłać polecenia równolegle, musisz otworzyć kilka kanałów. Każdy kanał tworzy osobny Erlang proces. Jedno połączenie może mieć wiele kanałów (multiplexing). Dla każdego kanału istnieją pewne struktury i obiekty w pamięci. Dlatego im więcej kanałów jest w ramach połączenia, tym więcej pamięci wykorzystuje RabbitMQ do zarządzania takim połączeniem.

RabbitMQ. Część 1. Wprowadzenie. Erlang, AMQP

Prosty przykład tworzenia połączenia i kanału przy pomocy RabbitMQ.Client:

// ...
private void TryConnect()
{
    var factory = new ConnectionFactory() 
    {
        HostName = "host_name",
        UserName = "user_name",
        Password = "p@ssword",
        // Включение автоматичекого восстановления
        // соединения после сбоев сети 
        AutomaticRecoveryEnabled = true
    };
    _connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
    _channel = _connection.CreateModel();
    // other options 
}

Otwieranie nowego połączenia dla każdej operacji zdecydowanie nie jest zalecane, ponieważ prowadzi to do znacznych kosztów. Kanały również powinny być stałe, ale wiele błędów protokołu prowadzi do zamknięcia kanału, więc czas trwania kanału może być krótszy niż połączenia.

Gdzie używa się RabbitMQ?

W kontekście mikrousług protokół AMQP i jego implementację w RabbitMQ często wykorzystuje się do asynchronicznej interakcji między usługami.

W kontekście IIOT protokół AMQP i jego implementację w RabbitMQ jest używany do wymiany danych między serwerami (serwer-serwer). Wykorzystuje się również wtyczkę MQTT Plugin RabbitMQ będącą implementacją protokołu MQTT do przesyłania danych między czujnikiem a serwerem w wolno prędkościowych środowiskach o dużym opóźnieniu (pełna lista obsługiwanych protokołów wymieniona jest na stronie projektu).

W następnym artykule zaczniemy dokładniej zgłębiać temat Exchanges.

Linki

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster