2012-12-15 11 views
6

Ponieważ nie jest możliwe wyszukiwanie/sprawdzanie podstawowych gniazd kolejek/buforów ZeroMQ w celu sprawdzenia, ile są one wykorzystywane, czy istnieje sposób na wykrycie, kiedy wiadomość zostanie upuszczona z powodu pełnego bufory w gnieździe wydawcy podczas wysyłania/kolejkowania?Wykrywanie upuszczonych wiadomości w kolejkach ZeroMQ

Na przykład, jeśli kolejka wydawcy jest pełna, operacja zmq_send po prostu upuści wiadomość.

W zasadzie to, co chcę osiągnąć, to sposób na wykrycie sytuacji, w których kolejki są zestresowane i/lub pełne, aby móc (później) dostroić rozwiązanie, aby działało lepiej. Jednym z alternatywnych sposobów byłoby dodanie numeru sekwencyjnego do każdej wiadomości i wykonanie prostych obliczeń w subskrybencie, ale nigdy nie jestem pewien, że wiadomość została utracona z powodu pełnych buforów w wydawcy.

+0

Istnieje bardzo dobry feed, który odpowiada: W jakich okolicznościach gniazda zeromq upuszczają lub nie dostarczają wiadomości? : http://stackoverflow.com/questions/9909909/under-what-cirstances-do-zeromq-sockets-drop-or-fail-to-deliver-messages Może to interesujące dla Ciebie – eMarine

Odpowiedz

6

Jest to przykład na to w ZeroMQ Guide (który należy przeczytać i strawić, jeśli chcesz używać 0MQ szczęśliwie): http://zguide.zeromq.org/page:all#Slow-Subscriber-Detection-Suicidal-Snail-Pattern

Mechanizm jest tak odpowiedziałeś sobie, aby dodać numer sekwencji w komunikat i umożliwić subskrybentowi wykrycie luk i podjęcie odpowiednich działań. W przypadku większości scenariuszy pubsub można podnieść domyślny HWM, który wynosi 1000, do czegoś znacznie wyższego; zależy to od średniego rozmiaru wiadomości.

+0

RIP Pieter. Ale ta odpowiedź jest nie do przyjęcia. ZMQ powinien nam dać sposób sprawdzenia, czy wiadomość została wysłana, czy nie. – James

1

Wiem, że to stary post, ale oto, co zrobiłem, gdy ostatnio spotkałem się z tym samym problemem.

Zdecydowałem się użyć DEALER/ROUTER i ustaw opcję ZMQ_SNDHWM do 1. Również pod warunkiem, że parametr timeout na każdej zmq_send(). Limit czasu może wynosić od 10 ms do 3 sekund, w zależności od scenariusza (wysyłanie lokalne lub zdalne).

Jeśli komunikat nie zostanie wysłany w określonym limicie czasu lub bufor wysyłania zostanie zapełniony, zostanie zwrócony błąd zmq_send(). To pozwoliło mi ustawić kolejkę ponawiania przed zmq. Wiem, że to nie jest doskonałe rozwiązanie, ale dla mnie działało dobrze. Tym, co mnie zastanawia, jest znaczenie wartości true/false zwróconej przez DEALER -socket zmq_send(). Nie byłem w stanie znaleźć odpowiedzi na to pytanie. Określa, czy informacja, że ​​wiadomość została zbuforowana, czy też wiadomość została dostarczona do ROUTER. W moim przypadku i tak otrzymałem potrzebne wyniki.

Tylko dla rekordu zrobiono to przy użyciu netmq, ale myślę, że dotyczy to również ZeroMQ.

Zgadzam się jednak z james. ZeroMQ (i netmq) powinny przynajmniej zapewnić sposób na sprawdzenie kolejki (i pobranie komunikatów), a także sposób na poinformowanie różnych gniazd, aby nie przekazywały wiadomości. Najlepszym rozwiązaniem byłoby wysyłanie wiadomości nie dostarczanych w odpowiednim czasie zgodnie ze skonfigurowanymi opcjami do jakiejś kolejki typu deadletter. Kolejka w martwym punkcie może być następnie obsługiwana osobno.

Powiązane problemy