web-dev-qa-db-fra.com

Ack ou Nack dans rabbitMQ

J'utilise rabbitMQ, je prends chaque message de la file d'attente avec basic_get sans procédure d'acquittement automatique, ce qui signifie que le message reste dans la file d'attente jusqu'à ce que j'accumule ou annule le message.

Parfois, j'ai des messages qui ne peuvent pas être traités à cause d'une exception qui les empêchait d'être complètement traités.

La question est de savoir ce qui importe si je reçois à la fois les messages en cas de succès et d’exception, je veux dire en termes de résultats, les messages de sortie sortiront toujours de la file d’attente, alors qu’importe que j’utilise ack ou nack dans ce scénario? ____.] Peut-être que quelque chose me manque lors de l'utilisation de chaque opération?

15
JavaSa

La commande basic.nack est apparemment une extension RabbitMQ, qui étend les fonctionnalités de basic.reject pour inclure un mode de traitement en bloc. Les deux incluent un drapeau "bit" (c'est-à-dire booléen) de requeue, vous avez donc plusieurs choix:

  • nack/reject avec requeue=1: le message sera renvoyé dans la file d'attente d'où il provient comme s'il s'agissait d'un nouveau message; cela pourrait être utile en cas de panne temporaire du côté du consommateur
  • nack/reject avec requeue=0 et un échange de lettres mortes (DLX) configuré, publiera le message sur cet échange, ce qui lui permettra d'être récupéré par une autre file d'attente.
  • nack/reject avec requeue=0 et aucun DLX ne supprimera simplement le message
  • ack enlèvera le message de la file même si un DLX est configuré

Si vous n'avez pas configuré DLX, toujours utiliser ack sera identique à nack/reject avec requeue=0; Cependant, l'utilisation de la fonction logiquement correcte dès le départ vous donnera plus de flexibilité pour configurer les choses différemment ultérieurement.

34
IMSoP

Ack et Nack suppriment tous deux le message de la file d'attente. La différence est que lorsque vous envoyez un message à Nack, il passe dans la file d'attente de lettres mortes (DLX) s'il en existe une définie pour cette file d'attente.

1
jhilden