Kolejki komunikatów

Ukończone

Kolejka komunikatów jest techniką służącą do komunikacji międzyprocesowej (zwanej również IPC) między różnymi składnikami aplikacji lub między aplikacjami. Kolejki komunikatów udostępniają protokół lub interfejs, aby umożliwić przekazywanie komunikatów.

Kolejki komunikatów dla IPC w ramach jednej maszyny zostały udostępnione za pośrednictwem bibliotek systemów UNIX <sys.msg.h> i POSIX mqueue.h, w których można ich używać zarówno w trybie synchronicznym, jak i asynchronicznym. Komunikat synchroniczny wymaga blokowania procesów wysyłania lub przyjmowania, gdy komunikat jest wysyłany, dopóki nie zostanie on potwierdzony przez odbiornik. Komunikaty asynchroniczne nie blokują procesów wysyłania ani przyjmowania, a także mogą być buforowane na potrzeby opóźnionego dostarczania.

Do zastosowań obejmujących wiele maszyn opracowano wiele zastrzeżonych systemów kolejek komunikatów typu open-source, np. WebSphere MQ firmy IBM, Java Message Service (JMS) i RabbitMQ. Wszystkie te systemy umożliwiają wysyłanie i odbieranie komunikatów oraz zarządzanie nimi.

Wykorzystanie kolejek komunikatów może zwiększyć złożoność projektu aplikacji i zwiększyć liczbę usług, którymi należy zarządzać, w porównaniu z tradycyjną obsługą komunikatów żądań i odpowiedzi. Jednak przy pewnej skali i w przypadku takich zastosowań, jak przetwarzanie strumieniowe, rozproszone systemy kolejek komunikatów są potrzebne w celu zapewnienia obsługi rozwiązań o większej złożoności i skali.

An interface connects to senders (or producers), which create messages, and to receivers (or consumers), which can receive the messages.

Rysunek 1. Interfejs łączy się z nadawcami (lub producentami), które tworzą komunikaty i odbiornikami (lub odbiorcami), które mogą odbierać komunikaty.

Cechy kolejek komunikatów

Kolejki komunikatów oraz ich nowatorski charakter można zrozumieć i docenić, porównując je z tradycyjnymi mechanizmami zdalnego wywołania procedury oraz mechanizmami żądanie-odpowiedź. Oto podstawowe cechy kolejki komunikatów:

Magazyn: W przeciwieństwie do tradycyjnych systemów żądań i odpowiedzi, które opierają się na podstawowych protokołach TCP i UDP za pośrednictwem gniazd, kolejki komunikatów zwykle przechowują komunikaty w pewnym typie buforu, dopóki nie zostaną odczytane przez proces docelowy lub zostały jawnie usunięte z kolejki komunikatów.

Asynchroniność: W przeciwieństwie do systemów żądań i odpowiedzi buforowanie komunikatów umożliwia kolejkom komunikatów uwidacznianie stopnia asynchroniczności w aplikacjach, co umożliwia procesom źródłowym wysyłanie komunikatów i umożliwienie im gromadzenia się w kolejce, podczas gdy procesy docelowe pobierają je do przetworzenia. Dzięki temu aplikacje mogą działać w określonych scenariuszach awarii, np. w przypadku wystąpienia łączności sporadycznej albo awarii procesu źródłowego lub docelowego.

Routing: kolejki komunikatów mogą również zapewniać funkcjonalność routingu, w której wiele procesów może odczytywać lub zapisywać komunikaty w tej samej kolejce, co umożliwia korzystanie z paradygmatów komunikacji emisji lub emisji pojedynczej.

Zalety korzystania z kolejek komunikatów

Główną zaletą kolejki komunikatów jest to, że zapewnia ona luźne sprzężenie między różnymi jednostkami w aplikacji rozproszonej. Pozwala to na asynchroniczną komunikację nieblokującą, która zapewnia wyższy poziom odporności na awarie procesów.

Message queues provide an interface that allows for programs to communicate with each other.

Rysunek 2. Kolejki komunikatów udostępniają interfejs umożliwiający programom komunikowanie się ze sobą.

  • Brak bezpośrednich połączeń między programami: kolejkowanie komunikatów umożliwia pośrednią komunikację między programami. Nadawcy nie muszą znać odbiorców komunikatów, ani odbiorcy nadawców. Dzięki temu logika wyznaczania tras komunikatów (i potencjalnie działanie) może być kontrolowana przez system kolejkowania komunikatów.
  • Komunikacja między programami może być niezależna od czasu: kolejki komunikatów zwykle buforują komunikaty między programami, dzięki czemu nie muszą blokować ani przerywać wykonywania w celu wysyłania lub odbierania komunikatów. Mogą one wykonywać inne zadania i przetwarzać odpowiedzi po nadejściu komunikatu lub później. Podczas pisania aplikacji do obsługi komunikatów nie trzeba wiedzieć (ani przejmować się tym), kiedy program wyśle komunikat lub kiedy obiekt docelowy będzie mógł go odebrać. Komunikat nie zostanie utracony; będzie przechowywany przez menedżera kolejek do momentu, gdy obiekt docelowy będzie gotowy do jego przetworzenia. Komunikat pozostanie w kolejce, dopóki nie zostanie usunięty przez program. Oznacza to, że programy do wysyłania i odbierania są oddzielone; nadawca może kontynuować przetwarzanie, nie czekając, aż odbiorca potwierdzi odbiór komunikatu. Podczas wysyłania komunikatu aplikacja docelowa nie musi nawet być uruchomiona. Może ona pobrać komunikat, gdy zostanie uruchomiona.
  • Praca może być wykonywana przez małe, samodzielne programy: kolejkowanie komunikatów umożliwia korzystanie z zalet korzystania z małych, samodzielnych programów. W przeciwieństwie do sytuacji, w której jeden duży program wykonuje sekwencyjnie wszystkie części zadania, istnieje możliwość rozdzielenia zadania między kilka mniejszych niezależnych programów. Program żądający wysyła komunikaty do każdego z oddzielnych programów z prośbą o wykonanie ich funkcji. Gdy wszystkie programy zakończą wykonywanie, wyniki zostaną odesłane w formie jednego lub wielu komunikatów.
  • Komunikacja może być sterowana zdarzeniami: programy mogą być kontrolowane zgodnie ze stanem kolejek. Można na przykład skonfigurować program do uruchamiania natychmiast po nadejściu komunikatu do kolejki. Można też określić, że program zostanie uruchomiony na przykład dopiero w momencie, gdy w kolejce znajdzie się 10 komunikatów powyżej określonego priorytetu lub 10 komunikatów o dowolnym priorytecie.
  • Aplikacje mogą przypisywać priorytet do komunikatu: program może przypisać priorytet do komunikatu, gdy umieszcza komunikat w kolejce. W ten sposób jest określana pozycja w kolejce, na której nowy komunikat zostanie dodany. Programy mogą pobierać komunikaty z kolejki według kolejności ich występowania lub przez pobranie określonego komunikatu. (Program może wybrać pobranie określonego komunikatu, jeśli szuka odpowiedzi na wysłane wcześniej żądanie).
  • Obsługa odzyskiwania: wiele kolejek komunikatów oferuje trwałość i rejestrowanie, co umożliwia odzyskiwanie stanu i komunikatów w kolejce podczas awarii.
  • Wiele kolejek: niektóre systemy zezwalają na wiele kolejek, które można zdefiniować i skonfigurować przez dewelopera aplikacji. Pozwala to na przekierowywanie komunikatów do odpowiednich jednostek na podstawie relacji wydawcy lub subskrybenta. Przykładem może być platforma Apache Kafka.
  • Łatwość skalowalności: kolejki komunikatów mogą być skalowane w poziomie w celu radzenia sobie ze wzrostem obciążenia komunikatów, w przeciwieństwie do ściśle powiązanych systemów, gdzie skalowanie i zarządzanie ruchem komunikacyjnym i punktami końcowymi jest trudniejsze.

Sprawdź swoją wiedzę

1.

Które z poniższych stwierdzeń nie stanowi opisu przewagi kolejek komunikatów nad tradycyjnymi rozwiązaniami w zakresie obsługi komunikatów?