Я думаю, что вы указать на одну слабость самого ActiveMQ: она не может гарантировать, что потребители действительно строг при употреблении сообщения.
У нас схожие проблемы с нашим ActiveMQ (5.10.7), потому что кажется, что KahaDB делают любит «фрагментации диска», и мы заметили это может быть, по крайней мере, двух вопросов с потребителями:
Case 1: Медленный потребитель
В нашей системе есть потребитель, который не может потреблять много сообщений одновременно. если только одно непонятое сообщение остается на странице kahaDB, оно будет содержать всю страницу (со всеми остальными сообщениями, которые уже были использованы и подтверждены). Для предотвращения KahaDB хранения достигнет 100% (что замедляет производителей) мы будем передавать сообщения в другом ActiveMQ экземпляра временной очереди, как это:
from("activemqPROD:queue:BIG_QUEUE_UNCONSUMED")
.to("activemqTEMP:queue:TEMP_BIG_QUEUE");
затем толкает их обратно:
from("activemqTEMP:queue:TEMP_BIG_QUEUE")
.to("activemqPROD:queue:BIG_QUEUE_UNCONSUMED");
альтернативой является сохранение их в файловой системе, а затем перезагрузка, но вы теряете JMS (и пользовательские) заголовки. С временным решением для очереди вы сохраняете все заголовки.
Случай 2: Потребитель, который никогда не дает подтверждение
Иногда даже мы делаем предыдущую операцию, даже все неизрасходованные очереди пусты, хранение остается выше 0%. Заглянув в файл KahaDB, мы видим, что все еще на страницах присутствуют события, не содержащие сообщений во всех QUEUES. Для ТЕМАТИКОВ мы прекратили использовать длительные подписки, тогда хранение также должно оставаться на уровне 0%.
Потенциальная причина (это предположение, но с большой уверенностью) заключается в том, что некоторые из потребляемых сообщений никогда не были acknowledged
должным образом. Поэтому мы считаем, что это причина, это происходит потому, что в журналах, мы все еще можем видеть сообщения
"not removing data file: 12345 as contained ack(s) refer to referenced file: [12344, 12345]"
Это может происходит, например, когда потребитель отсоединение abruptively (они потребляли некоторые сообщения, но отключиться перед отправкой ack
)
В нашем случае сообщения никогда не истекают, то это также может быть потенциальной проблемой для этого случая. Однако неясно, может ли установка истечения срока действия уничтожить сообщения «неактивные». Поскольку мы не хотим потерять какое-либо событие, для этих конкретных очередей нет срока действия.
По вашему вопросу, это выглядит вы во втором случае, то наше решение:
- Убедитесь, что больше не производитель/потребитель подключается к ActiveMQ
- Убедитесь, что все очереди и долговечный темы пустуют
- Удалить все файлы в хранилище KahaDB (из файловой системы)
- Restart ActiveMQ (свежие)
К сожалению, мы не нашли лучшего способа справиться с этими случаями, если у кого-то есть лучшая альтернатива, мы будем рады узнать об этом.
This article также может дать вам некоторое решение (например, установить политику истечения срока действия для очереди ActiveMQ.DLQ).
Вам нужно добавить больше конкретики. Поскольку это, кажется, Темы, которые вы используете, вам нужно определить, что вы делаете, поскольку сообщения на темы являются огнями и забываются, если в игре не работают длительные подписки. –
Вы установили любое истечение срока для всех своих сообщений, или у вас есть сообщение, которое никогда не истекает? –