Задать вопрос
@DamskiyUgodnik

Как избавится от потери сообщений в RabbitMq?

Всем привет!

Имеем:
  • RabbitMq сервер
  • Скрипт на питоне (используется pika), который добавляет сообщения в очередь (добавление идёт в простом цикле обычных id, формата 1,2,3,4, ....)
  • Очередь с сохранением на диск

Проблема:
При попытке добавить 100к заданий, добавляется не 100к, а чуть меньше. Пробовал несколько раз прогонять цикл, каждый раз "теряется" какое-то количество сообщений (от 2к до 4к). Что интересно, если в цикл добавить sleep, например в 3с после отправки каждых 5к сообщений, проблема пропадает (судя по всему за это время кролик успевает всё "скинуть" на диск).

Вопросы:
  • Нормальное ли это поведение RabbitMq (как я понимаю он набирает сообщения в память и не успевает скидывать их на диск, что странно, т.к. свободной оперативки на машине достаточно и по идее все 100к сообщений можно просто засунуть в память)?
  • Если это нормальное поведение, как это "мониторить" и как с этим жить? возможно просто надо что-то донастроить?
  • Вопрос задан
  • 1268 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
inoise
@inoise
Solution Architect, AWS Certified, Serverless
- Тюнить конфиг кролика
- Тюнить конфиг сервера
- Мониторить логи
- мониторить параметры сервера (диск, проц, память, одновременное число сообщений)
Перестать пользоваться принципом fire and forget и контролировать в скрипте факт успешной доставки сообщения в очередь с exponential retry
Ответ написан
@yarkin
Как упомянул Иван, Вам надо начать контролировать успешное получение сообщения RabbitMQ, для чего нужно включить специальный режим у канала отправки. Скорость отправки в таком режиме конечно будет намного ниже, чтобы это как-то улучшить (при условии что неважен порядок сообщений в очереди) можно:
1) Открыть несколько каналов и вести параллельную отправку по ним
2) Открыть канал без подтверждения отправки и с подтверждением, отправить в первый, к примеру, 999 сообщений, а затем во второй одно и ждать пока придёт подтверждение на последний (что-то может пойти не так, но выглядит рабочим).

Дополнительно можно попробовать Lazy режим у очереди.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы