2010-07-19 6 views
5

Notre équipe est dans un sprint de pointe pour choisir entre ActiveMQ ou RabbitMQ. Nous avons fait 2 petits pics producteurs/consommateurs en envoyant un message d'objet avec un tableau de 16 chaînes, un horodatage et 2 entiers. Les pointes sont correctes sur nos devs machines (les messages sont bien consommés).Les consommateurs de messages RabbitMQ arrêtent de consommer des messages

Puis vint les bancs. Nous avons d'abord remarqué que parfois, sur nos machines, lorsque nous envoyions beaucoup de messages, le consommateur était parfois suspendu. C'était là, mais les messages s'accumulaient dans la file d'attente.

Quand nous sommes allés sur le banc plateform:

  • groupe de 2 machines à RabbitMQ 4 cœurs/3.2Ghz, 4Go de RAM, la charge est équilibrée par un VIP
  • un à 6 consommateurs en cours d'exécution sur les machines à RabbitMQ, enregistrer les messages dans un DB mysql (même type de machine pour la DB)
  • 12 producteurs fonctionnant sur 12 machines AS (tomcat), attaquées avec jmeter fonctionnant sur une autre machine. La charge est d'environ 600 à 700 requêtes http par seconde, sur les servlets qui produisent la même charge de messages RabbitMQ.

Nous avons remarqué que parfois, les consommateurs hang (bien, ils ne sont pas bloqués, mais ils ne consomment plus des messages). Nous pouvons voir que chaque consommateur économise environ 100 msg/sec dans la base de données, donc quand on arrête de consommer, les messages globaux enregistrés par seconde en DB tombent avec le même ratio (si disons 3 consommateurs s'arrêtent, nous tombons autour de 600 msg/sec à 300 msg/sec).

Pendant ce temps, les producteurs sont ok, et produisent toujours au taux de jmeter (environ 600 msg/sec). Les messages sont dans les files d'attente et pris par les consommateurs encore "vivants".

Nous chargeons d'abord toutes les servlets avec les producteurs, puis lancons tous les consommateurs un par un, vérifiant si les connexions sont correctes, puis exécutons jmeter.

Nous envoyons des messages à un seul central. Tous les consommateurs écoutent une file d'attente persistante liée à l'échange.

Ce point est majeur pour notre choix. Avez-vous vu cela avec Rabbitmq, avez-vous une idée de ce qui se passe?

Merci pour vos réponses.

+0

Cela peut être plus approprié pour serverfault. – danben

+0

Merci, je l'afficherai dans serverfault non plus. –

+0

Etrange qu'il n'y a aucune mention de versions. Par exemple, Ubuntu et Debian ont tendance à empaqueter des versions plus anciennes mais quand c'est un outil critique qui est en développement actif, comme RabbitMQm, il est préférable d'exécuter des versions plus récentes. –

Répondre

4

Il vaut toujours la peine définition du nombre de prélecture lors de l'utilisation basic.consume:

channel.basicQos(100); 

avant la ligne channel.basicConsume afin de vous assurer de ne jamais avoir plus de 100 messages mis en attente dans votre QueueingConsumer.

+0

Pourriez-vous élaborer un peu plus? Comment ce paramètre pourrait-il aider à résoudre le problème des messages perdus? Je vous remercie. – Kimi

+3

bien, selon la question, les messages ne sont pas perdus, les consommateurs * semblent * cesser de traiter plus de messages. Avec le paramètre basicQos, il empêche le consommateur de pré-lire un grand nombre de messages avant que les autres consommateurs puissent récupérer des messages. Avec la préextraction infinie et si vous ne démarrez pas tous vos consommateurs en même temps, le premier consommateur peut pré-lire un grand nombre de messages. Ces messages pré-extraits ne seront pas livrés aux autres consommateurs –

+0

@Al Bundy Je ne voulais pas dire que les messages ont été perdus, mais que certains consommateurs ne consommaient plus de messages. Les messages sont dans la file d'attente et ne sont pas perdus. –

1

J'ai vu ce comportement lors de l'utilisation du plugin RabbitMQ STOMP. Je n'ai pas encore trouvé de solution.

Utilisez-vous le plugin STOMP?

+0

Merci pour votre réponse. Non, nous ne le faisons pas. Avez-vous vu une différence avec et sans plugin STOMP? –

+0

J'ai eu ce problème avec l'adaptateur STOMP mais pas sans. – Seb

0

Le canal dans un RabbitMQ est pas sûre. donc vérifier dans le canal du consommateur pour toutes les demandes de thread.

Questions connexes