2012-02-21 2 views
1

Я использую ActiveMQ вместе с Mule (своего рода ESB на основе Spring). У нас есть быстрый производитель и медленный потребитель. Это синхронная конфигурация только с одним потребителем.ActiveMQ с медленным потребительским пропуском 200 сообщений

Здесь конфигурация потребителя в весеннем стиле: http://pastebin.com/vweVd1pi

Самое большое требование, чтобы сохранить порядок сообщений. Однако через несколько часов после запуска этого кода, ActiveMQ пропускает 200 сообщений и отправляет следующие. 200 сообщений все еще присутствуют в activeMQ, они не теряются. Но наш клиент (Mule) имеет собственный код для проверки порядка сообщений с использованием уникального идентификатора.

У меня был этот вопрос уже несколько месяцев назад. Мы меняем потребителя, используя параметр «jms.prefetchPolicy.queuePrefetch = 1». Казалось, что он работал хорошо и был исправлением, в котором мы нуждались сейчас, когда вопрос снова появился на другом потребителе.

Это ошибка или проблема с конфигурацией?

+0

Когда вы говорите, что сообщения пропускаются и остаются в ActiveMQ, что это значит? Являются ли они в очереди (-ах), которую вы отправили, или в другом месте? –

ответ

0

Я не могу говорить о требовании с точки зрения Мула, но есть несколько особенностей брокера, на которые вы должны обратить внимание. Есть два способа, чтобы гарантировать сообщение упорядоченности в ActiveMQ:

Message groups являются одним из способов обеспечения того, чтобы набор связанных сообщений будет потребляться одним и тем же потребителем в том порядке, что они размещены на очереди. Чтобы использовать его, вам нужно указать заголовок JMSXGroupID для связанных сообщений и назначить им увеличивающийся номер JMSXGroupSeq. Если потребитель умирает, остается сообщения от этой группы будут отправлены другому одному потребителю, сохраняя при этом порядок.

Total message ordering распространяется на все сообщения на тема. Он настроен на брокере по принципу «по-назначению» и не требует особых изменений в клиентском коде. Он имеет накладные расходы на синхронизацию.

Обе функции позволяют масштабировать до нескольких потребителей.

+0

У нас должно быть несколько потребителей? а как же просто не отправлять сообщения потребителю, если он не готов к получению? или иметь опрос потребителей для получения большего количества сообщений, когда он будет готов? Есть ли такая стратегия? Или вы думаете, что у нас должен быть второй Потребитель, который возьмет верх, если первый занят. Мы хотели остаться в одной потребительской конфигурации. – VinceMD

+0

Вам не нужно иметь несколько потребителей, но механизмы для упорядочения сообщений одинаковы и позволяют масштабировать для лучшей производительности. Когда вы используете брокерский обмен сообщениями, брокер несет ответственность за передачу сообщений потребителю. Предварительная выборка оптимизирует этот процесс для снижения сетевого трафика - сообщения переходят в буфер на клиенте. Наиболее распространенный способ использования сообщений оттуда происходит асинхронно, регистрируя прослушиватель сообщений против сеанса (возможно, через Spring DefaultMessageListenerContainer). –

+0

ok, мы установили эксклюзивную настройку потребителя и проверили в активном запросе администратора mq, что он действительно рассматривает параметр. Но у нас все еще есть те же проблемы. Это всегда 200 сообщений, которые пропускаются и обрабатываются позже – VinceMD

Смежные вопросы