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.

Author: pinepain, 2014-06-08

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 metody basic.nack na true. Następnie broker odrzuci wszystkie niepotwierdzone, dostarczone Wiadomości do wiadomości włącznie określonej w polu delivery_tag metody basic.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 (no­ack=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.

 64
Author: pinepain,
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