2015-03-01 10 views
13

Używam rabbitMQ, biorę każdą wiadomość z kolejki z basic_get bez automatycznej procedury potwierdzania, co oznacza, że ​​wiadomość pozostaje w kolejce do momentu potwierdzenia wiadomości.Ack lub Nack w rabbitMQ

Czasami mam wiadomości, których nie można przetworzyć z powodu wyjątku, który uniemożliwił ich pełne przetworzenie.

Pytanie, jakie to ma znaczenie, jeśli oba potwierdzam wiadomości w pomyślnym wyniku i wyjątku, mam na myśli, że jeśli chodzi o wynik, wiadomości zawsze wyjdą z kolejki, więc jakie to ma znaczenie, jeśli użyję potwierdzenia lub nack w tym scenariusz? Może brakuje mi czegoś w związku z używaniem każdej opracji?

+0

Czy jedyną różnicą jest to, że nack pozwala na ponowne użycie, a ack nie? – JavaSa

Odpowiedz

27

Polecenie basic.nack jest najwyraźniej rozszerzeniem RabbitMQ, które rozszerza funkcjonalność basic.reject o tryb przetwarzania zbiorczego. Oba należą „bit” (tj Boolean) banderą requeue, więc rzeczywiście mają kilka możliwości:

  • nack/reject z requeue=1: wiadomość zostanie zwrócone do kolejki ono pochodzi, jakby to była nowa wiadomość; Może to być użyteczne w przypadku chwilowego braku po stronie konsumentów
  • nack/reject z requeue=0 i skonfigurowany martwą literą Exchange (DLX), opublikuje wiadomość do tej wymiany, by mógł on być odebrany przez inną kolejce
  • nack/reject z requeue=0 i nie będzie po prostu wyrzucić DLX komunikat
  • ack usunie wiadomość z kolejki nawet jeśli DLX jest skonfigurowany

Jeśli nie masz DLX skonfigurowany, zawsze usin g ack będzie taki sam, jak nack/reject z requeue=0; jednak użycie logicznie poprawnej funkcji od samego początku da ci większą elastyczność w późniejszej konfiguracji.

+0

Spektakularna odpowiedź! Czy można jednak wyjaśnić nieco, czy DLX jest już uważany za kolejkę. I jaka jest różnica między kolejką a wymianą? – JavaSa

+1

@JavaSa Jedną z powszechnych analogii (która może lub nie ma dla ciebie sensu) jest to, że wymiana jest jak poczta, a kolejka jest jak skrytka pocztowa. Publikujesz tylko nową wiadomość na giełdzie (nawet jeśli jest to domyślna giełda); centrala następnie przekieruje ją do zera, jednej lub wielu kolejek, generalnie w oparciu o swój "klucz routingu". Najprostszy DLX to taki, który rutuje wszystko w jedną kolejkę, ale może być tak skomplikowany, jak tego potrzebujesz. – IMSoP

1

Ack i Nack usuwają wiadomość z kolejki, różnica polega na tym, że kiedy Nack przesyła wiadomość, przechodzi do DLX (kolejka martwej litery), jeśli jest zdefiniowana dla tej kolejki.