Kolejka komunikatów

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

W informatyce, kolejki komunikatów i mailboxy są komponentami inżynierii oprogramowania używanymi do komunikacji międzyprocesowej lub do międzywątkowej komunikacji w obrębie jednego procesu. Używają kolejek do przesyłania wiadomości (przekazywania sterowania lub zawartości). Systemy komunikacji grupowej oferują podobne funkcjonalności.

Informacje ogólne[edytuj | edytuj kod]

Kolejka komunikatów jest asynchronicznym protokołem komunikacyjnym, co oznacza, że odbiorca i nadawca wiadomości nie muszą łączyć się z kolejką w tym samym czasie. Komunikaty przesłane kolejce są przechowywane aż do czasu odebrania przez inny proces.

Większość kolejek komunikatów ma ustawiony maksymalny rozmiar przesyłanych danych w jednej wiadomości. Te, które nie posiadają takich limitów, nazywane są mailbox.

Duża liczba implementacji kolejek działa tylko w obrębie systemu operacyjnego lub aplikacji. Takie mechanizmy przeznaczone są tylko dla celów tych systemów.

Inne implementacje pozwalają przesyłać wiadomości pomiędzy różnymi systemami, potencjalnie łącząc różne aplikacje czy systemy operacyjne. Takie kolejki zazwyczaj dostarczają metody pozwalające na zwiększenie niezawodności w przypadku awarii systemu. Przykłady komercyjnych implementacji to WebSphere MQ (wcześniej MQ Series) firmy IBM, kolejka firmy Fiorano, Oracle Advanced Queuing (AQ) wewnątrz bazy danych Oracle, oraz MSMQ Microsoftu. Rozwiązaniami dostępnymi na zasadach wolnego oprogramowaniaWeb Service Message Queue (WSMQ), JBoss Messaging, JORAM oraz ActiveMQ.

Większość systemów operacyjnych czasu rzeczywistego takich jak VxWorks i QNX zachęca do używania kolejkowania wiadomości jako podstawowego mechanizmu komunikacji międzyprocesowej lub międzywątkowej. Wynikająca z tego ścisła integracja przekazywania wiadomości z algorytmem szeregowania procesora jest jedną z głównych przyczyn użyteczności systemów czasu rzeczywistego dla aplikacji czasu rzeczywistego.

Wśród wczesnych przykładów komercyjnych systemów czasu rzeczywistego, które umożliwiały komunikację międzywątkową bazującą na kolejkowaniu wiadomości możemy wymienić VRTX i pSOS+, oba z początku lat osiemdziesiątych.

Zastosowanie[edytuj | edytuj kod]

W typowej konfiguracji kolejkowania wiadomości, administrator systemu instaluje i konfiguruje gotowe oprogramowanie do kolejkowania wiadomości (menedżera kolejek) i definiuje nazwaną kolejkę wiadomości.

Następnie aplikacja rejestruje rutynę nasłuchującą wiadomości umieszczonych w kolejce.

Druga i kolejne aplikacje mogę się połączyć z kolejką i przetransferować do niej wiadomość.

Menedżer kolejki przechowuje wiadomości aż do momentu gdy aplikacja odbierająca połączy się i wywoła zarejestrowaną rutynę. Następnie aplikacja odbierająca przetwarza wiadomość w odpowiedni sposób.

Istnieją liczne opcje warunkujące dokładną semantykę przekazywania wiadomości, takie jak:

  • trwałość (tzn czy kolejkowane dane mogą być jedynie przechowywane w pamięci czy też nie mogą zostać zagubione i muszą być w związku z tym przechowywane na dysku lub nawet przekazane do systemu zarządzania bazą danych).
  • polityka bezpieczeństwa - które aplikacje powinny mieć dostęp do tych wiadomości?,
  • reguły usuwania wiadomości - kolejki lub wiadomości mogą mieć określony TTL,
  • niektóre systemy wspierają filtrowanie danych, tak że odbiorca może widzieć tylko wiadomości spełniające pewne z góry określone kryteria,
  • reguły doręczania - czy musi zagwarantować, że wiadomość jest dostarczona przynajmniej lub co najwyżej raz?
  • reguły routowania - w systemie z wieloma serwerami kolejkowymi jakie serwery powinny otrzymywać skolejkowane wiadomości?
  • reguły kumulacji - czy wiadomości powinny być dostarczane natychmiast, czy też system powinien odczekać pewien czas i próbować doręczyć kilka wiadomości jednocześnie?,
  • kiedy wiadomość powinna zostać uznana za skolejkowaną? Kiedy znajduje się w jednej kolejce? Czy też kiedy została przekazana przynajmniej do jednej zdalnej kolejki? Lub też do wszystkich?
  • nadawca może potrzebować informacji czy niektórzy lub wszyscy z odbiorców otrzymali wiadomość.

Te wszystkie czynniki mogą mieć istotny wpływ na semantykę transakcji, niezawodność systemu i jego wydajność.

Synchroniczne vs asynchroniczne[edytuj | edytuj kod]

Wiele z lepiej znanych używanych protokołów komunikacyjnych działa synchronicznie. Protokół HTTP - używany w World Wide Web i usługach sieciowych - jest tutaj dobrym przykładem.

W wielu sytuacjach rozwiązanie to ma duży sens - np użytkownik wysyła żądanie do strony internetowej i oczekuje na odpowiedź.

Jednakże istnieją inne potencjalne scenariusza, dla których takie zachowanie nie jest pożądane. Na przykład aplikacja może chcieć poinformować inną, że zdarzenie miało miejsce, ale nie ma potrzeby oczekiwać na odpowiedź. Inny przykład to systemy typu publish/subscribe gdzie aplikacja publikuje informację odczytywaną następnie przez wielu klientów. W żadnym z tych przypadków nie miałoby sensu aby nadawca musiał czekać, jeśli na przykład któryś z odbiorców uległ awarii.

Alternatywnie aplikacja interaktywna może chcieć odpowiedzieć na określone części żądania natychmiastowo (jak na przykład poinformowanie klienta, że żądanie sprzedaży zostało zaakceptowane i przekazanie obietnicy wydrukowania faktury), ale skolejkować inne części (takie jak uzupełnienie kalkulacji rachunku, przekazanie danych do centralnego systemu księgowości i wzywanie wszelkiego rodzaju usług), tak aby zostały wykonane w późniejszym czasie.

We wszystkich tych sytuacjach posiadanie systemu, który wykonuje asynchroniczne kolejkowanie wiadomości możemy usprawnić działanie systemu jako całości.