ActiveMQ KahaDB Persistence Store Полный - PullRequest
6 голосов
/ 30 ноября 2011

Я использую ActiveMQ 5.4 с KahaDB в качестве хранилища сообщений. При публикации сообщений (с постоянством true) в теме, у которой есть подписчик Durable, хранилище постоянства увеличивается, даже если сообщения отправляются подписчику. Таким образом, это вызывает проблему, поскольку хранилище сообщений заполняется и больше не принимает сообщения.

Итак, мой вопрос: почему хранилище сохраняемости не отбрасывает сообщения в KahaDB, даже сообщения отправляются?

С уважением,

Шринивас

1 Ответ

10 голосов
/ 02 декабря 2011

То, что вы видите, это взаимодействие между хранилищем сообщений ActiveMQ и поведением для долговременных подписок на темы .

Если у вас надежные подписки, темаобрабатывается как очередь для clientId каждого подписчика (устанавливается на Connection).Логика заключается в том, что клиент не хочет пропустить ни одного сообщения при отключении.Так что, если они отключатся, долговременная подписка будет зависать и поддерживать сообщения в живых.

Хранилище сообщений AMQ использует журналы данных для своего журнала сообщений.Они пишутся последовательно и никогда не удаляются из (что потребует произвольного доступа).Существует второй файл, который отслеживает, какие сообщения были использованы.Как только все сообщения в файле данных будут использованы, этот файл будет удален.

Итак, вы видите, что некоторые сообщения в файле данных не используются этими долговременными подписками и просто зависают.вокруг.ClientIds для постоянных абонентов, которые не используются постоянно, могут вызвать эту проблему.Вероятно, что-то не так с использованием этой функции, если вы используете JMX для проверки подписок в брокере, что должно помочь вам найти причину.

Как правило, всякий раз, когда вы думаете, что хотите использовать долговременную подписку, используйте вместо этого виртуальные темы - их гораздо проще рассуждать, проверять и балансировать нагрузку.С другой стороны, если вы просто хотите получить последние пару сообщений при повторном подключении подписчика темы, а не все сообщения, которые вы, возможно, пропустили, используйте ретроактивных потребителей .

Простой способчтобы обойти эту проблему, нужно всегда использовать время жизни при отправке сообщения - почти в каждом случае использования есть ограничение по времени, когда сообщение должно быть использовано в любом случае.ActiveMQ истекает сообщения после этой точки, и освобождает сообщения в файлах данных для удаления.

...