web-dev-qa-db-fra.com

RabbitMQ différence entre exclusif et suppression automatique?

Le livre "RabbitMQ in Action" à la page 19 donne ces descriptions d'exclusivité et de suppression automatique:

exclusif - Lorsqu'il est défini sur true, votre file d'attente devient privée et ne peut être consommée que par votre application. Ceci est utile lorsque vous devez limiter une file d'attente à un seul consommateur.

suppression automatique - La file d'attente est automatiquement supprimée lorsque le dernier consommateur se désabonne. Si vous avez besoin d'une file d'attente temporaire utilisée uniquement par un consommateur, combinez la suppression automatique avec l'exclusivité. Lorsque le consommateur se déconnecte, la file d'attente est supprimée.

Mais pour autant que je puisse voir lors de l'utilisation exclusive, la suppression automatique est redondante. Seule une exclusivité est nécessaire. Le RabbitMQ tutoriel semble dire que c'est le cas

... une fois que nous avons déconnecté le consommateur, la file d'attente doit être supprimée. Il y a un drapeau exclusif pour ça:

result = channel.queue_declare(exclusive=True)

Il n'y a aucune mention dans ce tutoriel sur la suppression automatique et Sudo rabbitmqctl list_bindings semble indiquer que la file d'attente est en fait supprimée après le départ du récepteur.

42
user782220

Eh bien, il est vrai que les files d'attente exclusive seront automatiquement supprimées lorsque le consommateur se déconnectera (voir documentation collé ci-dessous). Cependant, il y a des cas où vous souhaitez que les files d'attente soient non exclusives, mais toujours supprimées automatiquement (par exemple, si je veux ajouter un autre consommateur).

exclusif

Les files d'attente exclusives ne sont accessibles que par la connexion actuelle et sont supprimées à la fermeture de cette connexion. La déclaration passive d'une file d'attente exclusive par d'autres connexions n'est pas autorisée.

suppression automatique

S'il est défini, la file d'attente est supprimée lorsque tous les consommateurs ont fini de l'utiliser. Le dernier consommateur peut être annulé explicitement ou parce que sa chaîne est fermée. S'il n'y a jamais eu de consommateur dans la file d'attente, il ne sera pas supprimé. Les applications peuvent explicitement supprimer les files d'attente de suppression automatique en utilisant la méthode Delete comme d'habitude.

Personnellement, je préfère n'utiliser aucun de ces paramètres, optant plutôt pour le paramètre RabbitMQ expiration de la file d'attente , ce qui est mieux si j'ai une déconnexion du consommateur et que je me reconnecte immédiatement (ou peu de temps) plus tard; les messages ne sont pas perdus dans ce cas. Mais, bien sûr, tout dépend de votre application et de vos besoins.

53
theMayer

Contrairement à ce que theMayer a décrit, mes tests ont montré qu'il existe une différence de comportement lorsque la suppression automatique est basculée tandis que l'exclusivité est définie sur true. Si la suppression automatique est définie sur false, la file d'attente est en effet liée à la connexion et disparaîtra à la fin de la connexion. Si la suppression automatique est définie sur true, la file d'attente sera supprimée après l'annulation du dernier consommateur. Il existe une différence entre une connexion et un consommateur. Vous pouvez être connecté, mais ne pas consommer une file d'attente donnée. Si vous avez besoin que le cycle de vie de la file d'attente soit lié à votre connexion plutôt qu'à votre consommation active, définissez la suppression automatique sur false en conjonction avec exclusive = true.

11
kylejmcintyre