Управление памятью RabbitMQ с помощью Docker

#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 поставляется с функциональностью, позволяющей подтвердить ваше сообщение. если вы подтвердите сообщение, оно будет удалено из очереди. итак, у вас есть два варианта для подтверждения:

  1. используйте режим автоматического подтверждения { noAck: true } :

    channel.consume(queue, function(msg) { // само сообщение находится здесь! }, { noAck: true });

  2. руководство по подтверждению:

    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