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:

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ściconsumers(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 .
Krótko o Erlang
Kod źródłowy projektu znajduje się w repozytorium na . Architektura opiera się na i BEAM.
Erlangzostał opracowany przez firmęEricssonw połowie lat 80. jako rozproszony, odporny na awarie system czasu rzeczywistego dla aplikacji wymagających niezawodności pracy na poziomie 99,999%.Erlangjest stosowany w różnych branżach i nowoczesnych zastosowaniach, na przykład w
Krótko o RabbitMQ
– to broker wiadomości z otwartym kodem źródłowym. On routuje wiadomości zgodnie z wszystkimi podstawowymi zasadami protokołu opisanego w . 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ć?

Krótko pracę RabbitMQ można opisać w następujący sposób:
- Wydawca wysyła wiadomość do określonej wymiany
- Wymiana, otrzymując wiadomość, kieruje ją do jednej lub kilku kolejek zgodnie z zasadami powiązania między nią a kolejką
- Kolejka przechowuje odnośnik do tej wiadomości. Sama wiadomość jest przechowywana w pamięci operacyjnej lub na dysku
- Gdy tylko konsument jest gotowy do odebrania wiadomości z kolejki, serwer tworzy kopię wiadomości za pomocą odnośnika i ją wysyła
- Konsument odbiera wiadomość i wysyła do brokera potwierdzenie
- Broker, otrzymując potwierdzenie, usuwa kopię wiadomości z kolejki. Następnie usuwa ją z pamięci operacyjnej i dysku
RPC
Proces 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:

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 (). 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.

Prosty przykład tworzenia połączenia i kanału przy pomocy :
// ...
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ę będącą implementacją protokołu 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 ).
W następnym artykule zaczniemy dokładniej zgłębiać temat Exchanges.
Linki
Źródło: habr.com
