1
votes

RabbitMQ: envoyer des messages fixes à partir de la file d'attente pour plusieurs consommateurs

Existe-t-il un moyen de restreindre la file d'attente RabbitMQ pour ne distribuer qu'un nombre fixe de messages de la file d'attente aux consommateurs?

J'ai 2 files d'attente Q1 et Q2 et 10 consommateurs. Chaque consommateur peut traiter les messages de Q1 et Q2.A tout moment, seuls 2 consommateurs devraient traiter les messages de Q2.Tous les 10 consommateurs peuvent traiter le message de Q1 simultanément.

Y a-t-il une configuration dans RabbitMQ que nous pouvons spécifier, de sorte que RabbitMQ ne pousse que 2 messages de Q2 à n'importe quel consommateur gratuit et envoie les 2 suivants seulement après avoir été reconnus, même si les autres consommateurs sont libres et prêts à consommer.

/ p>

Plus d'informations sur le problème:

Pourquoi ne traiter que 2 messages à la fois? : Les messages Q2 font un appel de service Web et le point de terminaison du service Web (tiers) ne peut traiter que 2 messages simultanément.

Ne pouvons-nous pas utiliser la concurrence? : Si nous utilisons un ListenerContainer (Spring AMQP), le conteneur est par consommateur. Nous pouvons limiter le nombre de messages qu'un consommateur peut recevoir à la fois, mais lorsque nous avons 10 consommateurs, s'il y a des messages dans la file d'attente, chaque consommateur aura sa part.

Peut-on configurer seulement 2 consommateurs écoutant Q2? : Je comprends que nous pouvons y parvenir en configurant seulement 2 consommateurs pour Q2, mais j'essaie d'éviter cela. Si, pour une raison quelconque, ces 2 consommateurs tombent en panne, le traitement de Q2 sera interrompu. Si 10 consommateurs sont configurés, nous pouvons garantir que le traitement se produira jusqu'à ce que le dernier consommateur soit arrêté.

Vous cherchez à voir s'il y a une configuration dans RabbitMQ que nous pouvons utiliser ou une solution suggérée.

Merci d'avance!


1 commentaires

C'est généralement au consommateur de ne pas «surconsommer» les messages par le biais d'une sorte de limite de débit interne. En fonction de votre bibliothèque, vous pouvez simplement bloquer le rappel d'abonnement jusqu'à ce que vous soyez prêt à recevoir un nouveau message.


3 Réponses :


1
votes

Je suis à peu près sûr que prélecture consommateur accomplira ce que vous voulez. Mais, Q2 ne peut avoir qu'un seul consommateur pour que cela fonctionne. Il n'y a aucun moyen de coordonner entre plusieurs consommateurs - vous devrez le faire vous-même et vous pourriez utiliser RabbitMQ pour faire la coordination.


REMARQUE: l'équipe RabbitMQ surveille les rabbitmq-users liste de diffusion et ne répond que parfois aux questions sur StackOverflow.


1 commentaires

Merci beaucoup Luke pour la réponse rapide. Je peux le faire avec le nombre de prélecture et en limitant les concurrentesConsumers. Mais oui, je dois limiter le nombre de consommateurs abonnés à ce Q.



0
votes

Je pense que vous vous retrouvez dans la définition du problème. Ce dont vous avez vraiment besoin est trivial, alors décomposons cela un peu.

Étant donné deux files d'attente, Q1 et Q2

  • 10 consommateurs
  • Chaque consommateur peut traiter les messages des Q1 et Q2.
  • À tout moment, seuls deux consommateurs doivent traiter les messages du deuxième trimestre.
  • Les 10 consommateurs peuvent traiter le message du premier trimestre simultanément.

Commentaires sur l'énoncé du problème

Premièrement, les files d'attente sont supposées indépendantes. Un processus indépendant P aura la file d'attente Q , donc Q1 sert le processus P1 . Il s'agit d'une exigence mathématique stricte - vous ne pouvez pas définir deux files d'attente pour un même processus P .

Ainsi, la deuxième contrainte est mathématiquement incorrecte, pour la même raison que vous ne pouviez pas écrire une fonction valide qui accepte un paramètre de type string et bool de manière interchangeable. Il doit accepter l'un ou l'autre, car ce ne sont pas des types compatibles, ou il doit accepter un seul ancêtre commun des types sans égard aux sous-types. Ceci est une variante du Liskov Principe de substitution .

Redéfinir le problème

Il y a un total de 12 consommateurs dans le système:

  • Q1 compte 10 consommateurs
  • Q2 a 2 consommateurs
  • [Important] Les consommateurs ne sont pas partagés entre les files d'attente

Y a-t-il une configuration dans RabbitMQ que nous pouvons spécifier, de sorte que RabbitMQ ne pousse que 2 messages de Q2 à n'importe quel consommateur gratuit et envoie les 2 suivants seulement après avoir été reconnus, même si les autres consommateurs sont libres et prêts à consommer.

/ p>

Sur la base de la nouvelle définition du problème, vous avez deux options:

  1. Utilisez un Basic.Get < / code> - extrait le message suivant de la file d'attente dès que le consommateur a fini de traiter le dernier message.
  2. Utilisez la la prélecture consommateur avec la limite de 1. Cela délivrera les premier et deuxième messages pour chaque consommateur immédiatement, puis délivrez des messages supplémentaires un à la fois lorsque le message suivant pour ce consommateur est reconnu. C'est un peu plus compliqué, mais cela peut avoir du sens si vos marges de latence sont inférieures à 10 millisecondes.

Notez qu'en définissant correctement l'espace des problèmes, nous avons éliminé le problème fondamental consistant à essayer de déterminer comment garantir que seuls deux consommateurs traitent les messages Q2 à tout moment .


0 commentaires

0
votes

essayez la nouvelle fonctionnalité Single Active Consumer à partir de la version 3.8+.

Un seul consommateur actif permet de n'avoir qu'un seul consommateur à la fois dans une file d'attente et de basculer vers un autre consommateur enregistré au cas où le consommateur actif serait annulé ou mourrait. La consommation avec un seul consommateur est utile lorsque les messages doivent être consommés et traités dans le même ordre qu'ils arrivent dans la file d'attente. Un seul consommateur actif peut être activé lors de la déclaration d'une file d'attente, avec l'argument x-single-active-consumer défini sur true

https://www.rabbitmq.com/consumers.html#single -consommateur-actif

par exemple avec le client Java:


1 commentaires

Bien que le lien puisse répondre à la question, il est possible que le lien soit supprimé ou que les informations soient déplacées vers une autre URL à l'avenir. Par conséquent, il est préférable de fournir certaines de ces informations dans votre réponse pour que les futurs lecteurs puissent y accéder, même si cela se produit.