2011-12-01 19 views
7

Mam pewne problemy ze zrozumieniem potwierdzić z RabbitMQ, widzę następujące wyjaśnienia od RabbitMQ:Zachowanie kanałów w trybie „Potwierdź” z RabbitMQ

Uwagi

Broker traci uporczywe wiadomości, jeśli ulega awarii, zanim te wiadomości zostaną zapisane na dysku. Pod pewnymi warunkami powoduje to, że broker zachowuje się w zaskakujący sposób. Na przykład, rozważmy tę scenariusz:

  • klient publikuje uporczywy wiadomość do trwałego kolejce

  • klient zużywa się komunikat z kolejki (zauważyć, że wiadomość jest trwała i kolejka trwałe) , ale nie ma jeszcze ack go

  • broker umiera i zostaje wznowiona i

  • klient łączy się ponownie i rozpoczyna wiadomości pracochłonne.

W tym momencie klient mógł zasadnie przyjąć, że wiadomość zostanie ponownie wydana. Tak nie jest: ponowne uruchomienie spowodowało, że broker utracił wiadomość. Aby zagwarantować trwałość, klient powinien używać potwierdzeń. Jeśli kanał wydawcy był w trybie potwierdzania, , wydawca nie otrzymał potwierdzenia utraty zgubionej wiadomości (ponieważ konsument nie potwierdził jej i nie został zapisany na dysku).

Następnie Używam tego http://hg.rabbitmq.com/rabbitmq-java-client/file/default/test/src/com/rabbitmq/examples/ConfirmDontLoseMessages.java zrobić jakieś podstawowe badania i weryfikacji potwierdzają, ale trochę dziwne wyniki:

  1. Sposób waitForConfirmsOrDie nie blokują producenta, który różni się od moich oczekiwań Przypuszczam, że waitForConfirmsOrDie zablokuje producenta, dopóki wszystkie wiadomości nie zostaną potwierdzone lub jeden z nich zostanie nack'd.
  2. Usuwam channel.confirmSelect() i channel.waitForConfirmsOrDie() od wydawcy, i zmieniam konsumenta z automatycznego potwierdzenia na ręczny ack, publikuję wszystkie wiadomości do kolejki i odbieram komunikaty jeden po drugim, a następnie zatrzymuję rabbitmq serwer podczas procesu konsumowania, czego oczekuję teraz, to, że lewe wiadomości zostaną utracone po ponownym uruchomieniu serwera rabbitmq, ponieważ kanał nie jest w trybie potwierdzania, ale nadal widzę wszystkie pozostałe wiadomości w kolejce po restarcie serwera.

Od kiedy jestem nowy w RabbitMQ, czy ktoś może mi powiedzieć, gdzie jest mój problem z potwierdzeniem zrozumienia?

Odpowiedz

3

Rozumiem, że "Potwierdzenie kanału" oznacza, że ​​Broker potwierdza, że ​​udało się uzyskać wiadomość od producenta, niezależnie od tego, czy konsument uznał tę wiadomość, czy nie.W zależności od rodzaju kolejki i wiadomości dostarczenia trybie zobaczyć http://www.rabbitmq.com/confirms.html szczegóły,

komunikaty są potwierdzone, gdy:

  • zdecyduje wiadomość nie będą kierowane do kolejki (jeżeli obowiązkowe flaga jest ustawiona następnie basic.return wysyłany jest pierwszy) lub
  • przejściowy wiadomość osiągnęła wszystkie swoje kolejki (i lustra) lub
  • trwałe wiadomości osiągnął wszystkie swoje kolejki (i lusterka) i zostało utrwalone na dysku (i fsynced) lub
  • trwałe wiadomość została zużyta (i jeśli to konieczne uznał) ze wszystkich swoich kolejek
0

Stare pytanie, ale cóż ..

opublikować wszystkie wiadomości do kolejki i konsumować wiadomości pojedynczo, następnie zatrzymuję serwer rabbitmq podczas procesu konsumowania, czego oczekuję teraz, że pozostawione wiadomości zostaną utracone po ponownym uruchomieniu serwera rabbitmq, ponieważ kanał nie jest w trybie potwierdzania, ale nadal widzę wszystkie inne wiadomości w kolejce po restart serwera.

Tak właśnie powinien działać, JEŚLI włączona jest funkcja wytrwałości. Jeśli serwer ulegnie awarii lub coś pójdzie nie tak, wiadomości nie będą mogły zostać potwierdzone, a zatem nie zostaną usunięte z kolejki.

Wiadomości zostaną usunięte z kolejki tylko wtedy, gdy zostaną potwierdzone, że są obsługiwane, lub broker jeszcze nie zapisał go w pamięci lub na dysku, zanim serwer się zawiesił.

Potwierdzanie i potwierdzanie można wyłączyć, jeśli jest to wymagane, a producent nie będzie czekał na pliki. Nie mogę znaleźć dokładnego polecenia w tej chwili, ale istnieje.

Więcej na temat pakietów i potwierdzeń: https://www.rabbitmq.com/reliability.html