#node.js #docker #memory-management #rabbitmq #node-amqp
#node.js #docker #управление памятью #rabbitmq #узел-amqp
Вопрос:
Я использую образ docker для управления RabbitMQ. Проблема заключается в том, что примерно через 1 неделю безотказной работы дисковое пространство и память почти истощаются. Мне нужно снова завершить и перезапустить его, чтобы он нормально функционировал, но при этом все существующие сообщения в очередях теряются.
Команда, которую я использую для запуска сервера rabbitmq, : docker run --rm -it --hostname my-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
Я использую постоянные сообщения и длительные очереди.
Количество очередей будет около 70.
Количество подключений в секунду может варьироваться от 5 до 100
Я использую модуль npm amqplib для взаимодействия с RabbitMQ с помощью Nodejs.
Я делаю что-то не так? Или я должен настроить на любом сервере напрямую, если использую docker image? Есть ли способ удалить только acknowledged
сообщения?
Заранее спасибо.
Ответ №1:
это определение долговечности в соответствии с официальной документацией rabbitmq:
Долговечность
Очереди могут быть длительными или временными. Метаданные длительной очереди хранятся на диске, в то время как метаданные временной очереди сохраняются в памяти, когда это возможно. Такое же различие проводится для сообщений во время публикации в некоторых протоколах, например, AMQP 0-9-1 и MQTT.
В средах и вариантах использования, где важна долговечность, приложения должны использовать длительные очереди и следить за тем, чтобы publish отмечал опубликованные сообщения как сохраненные.
итак, если вы используете стойкость в разделе сообщений, это означает, что вы сохраняете их в хранилище. rabbitmq поставляется с функциональностью, позволяющей подтвердить ваше сообщение. если вы подтвердите сообщение, оно будет удалено из очереди. итак, у вас есть два варианта для подтверждения:
-
используйте режим автоматического подтверждения { noAck: true } :
channel.consume(queue, function(msg) { // само сообщение находится здесь! }, { noAck: true });
-
руководство по подтверждению:
channel.consume(queue, function(msg) { // само сообщение находится здесь! // Я могу подтвердить вручную channel.ack(сообщение); }, { noAck: false });
итак, есть статья по оптимизации rabbitmq: https://www.cloudamqp.com/blog/2018-01-08-part2-rabbitmq-best-practice-for-high-performance.html