Управление памятью RabbitMQ с помощью 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.

Я делаю что-то неправильно? Или я должен настроить на любом сервере напрямую, если использую образ докера? Есть ли способ удалить только сообщения acknowledged?

Заранее спасибо.


person Pranesh A S    schedule 13.11.2020    source источник


Ответы (1)


это определение долговечности согласно официальной документации rabbitmq:

Долговечность

Очереди могут быть устойчивыми или временными. Метаданные долговременной очереди хранятся на диске, а метаданные временной очереди по возможности хранятся в памяти. Такое же различие делается для сообщений во время публикации в некоторых протоколах, например. AMQP 0-9-1 и MQTT.

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

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

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

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

  2. подтвердите вручную:

    channel.consume(queue, function(msg) { // само сообщение находится здесь! // Я могу подтвердить подтверждение вручную channel.ack(msg); }, { noAck: false });

поэтому есть статья по оптимизации rabbitmq: https://www.cloudamqp.com/blog/2018-01-08-part2-rabbitmq-best-practice-for-high-performance.html

person Babak Abadkheir    schedule 13.11.2020