Jak zgłaszać wiadomości w RabbitMQ
Gdy konsument otrzyma wiadomość, Konsument / Pracownik wykonuje pewne walidacje, a następnie dzwoni do serwisu internetowego. W tej fazie, jeśli wystąpi jakiś błąd lub Walidacja nie powiedzie się, chcemy, aby wiadomość została przywrócona do kolejki, z której została pierwotnie użyta.
Przeczytałem dokumentację RabbitMQ. Jestem jednak zdezorientowany różnicami między metodami odrzucania, nack i anulowania.
1 answers
Krótka odpowiedź:
Aby zażądać konkretnej wiadomości, możesz wybrać zarówno basic.reject
, jak i basic.nack
z flagą multiple
ustawioną na false.
basic.consume
wywołanie może również skutkować ponownym dostarczeniem wiadomości, Jeśli używasz wiadomości potwierdzającej i w określonym czasie na konsumencie jest nie potwierdzona wiadomość, a konsument wychodzi bez ich ack-ing.
basic.recover
będzie ponownie dostarczać wszystkie niezakodowane wiadomości na określonym kanale.
Długa odpowiedź:
basic.reject
oraz basic.nack
oba służą temu samemu celowi-upuść lub Zażądaj wiadomości, której nie może obsłużyć konkretny konsument(w danym momencie, pod pewnymi warunkami lub w ogóle). Główną różnicą między nimi jest to, że basic.nack
obsługuje przetwarzanie masowych wiadomości, podczas gdy basic.reject
nie. {47]}
Ta różnica opisana w negatywne podziękowania artykuł na oficjalnej stronie RabbitMQ:
Specyfikacja AMQP definiuje metodę
basic.reject
, która pozwala klientom na Odrzuć pojedyncze, dostarczone wiadomości, nakazując brokerowi odrzucenie ich lub zażądanie ich. Niestety,basic.reject
nie zapewnia wsparcia dla negatywnie potwierdzających wiadomości masowo.Aby to rozwiązać, RabbitMQ obsługuje metodę
basic.nack
, która zapewnia całą funkcjonalnośćbasic.reject
, podczas gdy pozwala również na zbiorcze przetwarzanie wiadomości.Aby odrzucać wiadomości masowo, klienci ustawiają flagę
multiple
metodybasic.nack
natrue
. Następnie broker odrzuci wszystkie niepotwierdzone, dostarczone Wiadomości do wiadomości włącznie określonej w poludelivery_tag
metodybasic.nack
. W tym zakresie,basic.nack
uzupełnia masową semantykę potwierdzającąbasic.ack
.
Zauważ, że metoda basic.nack
jest rozszerzeniem specyficznym dla RabbitMQ, podczas gdy metoda basic.reject
jest częścią specyfikacji AMQP 0.9.1.
Jak basic.cancel
metoda, używana do powiadamiania serwera, że klient zatrzymuje wysyłanie wiadomości. Uwaga, że klient może otrzymać dowolny numer wiadomości pomiędzy metodą basic.cancel
wysyłającą odebraną odpowiedź cancel-ok
. Jeśli wiadomość acknowledged jest używana przez Klienta i ma ona wszelkie Nie potwierdzone wiadomości, zostaną one przeniesione z powrotem do kolejki, z której pierwotnie były używane.
basic.recover
ma pewne ograniczenia w RabbitMQ: to
- Podstawowe.recover with requeue=false
- Podstawowe.Odzyskaj synchroniczność
Oprócz erraty, według specyfikacji RabbitMQ basic.recover
ma częściowy wsparcie (odzyskiwanie z requeue = false nie jest obsługiwane.)
Uwaga o basic.consume
:
Kiedy basic.consume
uruchamiane bez auto-ACK (noack=false
) i są pewne oczekujące wiadomości nie-acked wiadomości, następnie gdy konsument zostanie anulowany (umiera, błąd krytyczny, wyjątek, cokolwiek), że oczekujące wiadomości zostaną ponownie dostarczone. Technicznie rzecz biorąc, oczekujące wiadomości nie będą przetwarzane (nawet martwe litery) dopóki konsument ich nie zwolni (ack/nack/reject/recover). Dopiero po że będą przetwarzane (np. deadlettered).
Na przykład, powiedzmy, że wysyłamy oryginalnie 5 wiadomości z rzędu:
Queue(main) (tail) { [4] [3] [2] [1] [0] } (head)
A następnie konsumować 3 z nich, ale nie ack je, a następnie anulować konsumenta. Mamy taką sytuację:
Queue(main) (tail) { [4] [3] [2*] [1*] [0*] } (head)
Gdzie gwiazda (*
) zaznacza, że redelivered
flaga ustawiona na true
.
Załóżmy, że mamy sytuację z dead-lettered Exchange set i kolejką dla dead-lettered messages
Exchange(e-main) Exchange(e-dead)
Queue(main){x-dead-letter-exchange: "e-dead"} Queue(dead)
I załóżmy, że wysyłamy 5 wiadomości z expire
właściwość ustawiona na 5000
(5 sec):
Queue(main) (tail) { [4] [3] [2] [1] [0] } (head)
Queue(dead) (tail) { }(head)
A następnie pobieramy 3 wiadomości z kolejki main
i przytrzymujemy je przez 10 sekund:
Queue(main) (tail) { [2!] [1!] [0!] } (head)
Queue(dead) (tail) { [4*] [3*] } (head)
Gdzie wykrzyknik (!
) oznacza unacked message. Takie wiadomości nie mogą być dostarczane do żadnego konsumenta i zwykle nie mogą być wyświetlane w panelu zarządzania. Ale anulujmy konsumenta, pamiętajmy, że nadal trzyma on 3 niezakodowaną wiadomość:
Queue(main) (tail) { } (head)
Queue(dead) (tail) { [2*] [1*] [0*] [4*] [3*] } (head)
Więc teraz, że 3 wiadomości, które były w głowie umieścić z powrotem do pierwotnej kolejki, ale jak mają ustawione TTL dla każdej wiadomości, są martwe-literowane na ogonie kolejki martwych liter(oczywiście, poprzez wymianę martwych liter).
P. s.:
Konsumowanie wiadomości aka nasłuchiwanie nowej różni się w jakiś sposób od bezpośredniego dostępu do kolejki (otrzymywanie jednej lub więcej wiadomości bez dbania o innych). Zobacz też basic.get
opis metody więcej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-22 13:01:58