Мы получаем данные из очередей RabbitMQ (с помощью компоненты) при этом есть следующие особенности:
- Очередей может быть много от 1 до 50
- Как правило очереди могут обрабатываться параллельно (независимо) но некоторые очереди должны обрабатываться последовательно (вначале прочитали все сообщения из одной очереди, а только потом можем читать из другой)
- Сообщений относительно не много, т.е. система больше времени ожидает сообщения, чем их обрабатывает
- Желательно обрабатывать сообщения как можно быстрее, т.е. как только сообщение появилось в очереди его нужно обрабатывать
Вопрос: как лучше организовать ожидание и получение сообщений на сервере так, чтобы с одной стороны обеспечить выполнение требований (см. выше) а с другой не нагружать сервер лишней работой?
Варианты которые, мы пробовали (и которые не очень):
- Обычное регл. задание которое выполняется раз в 3 секунды и последовательно получает сообщения по списку очередей.
Минусы:
- сильно нагружает сервер (особенно если это ERP и в базе на момент запуска нет соединений, и в память каждый раз грузятся все метаданные)
- т.к. очереди обрабатываются последовательно, то из каждой конкретной очереди данные забираются редко (ждем все остальные) и данные оперативно не приходят в систему
- регл. задание не успевает выполниться за 3 сек
- Обычное регл. задание которое выполняется раз в 3 секунды и для каждой очереди (группы очередей) запускает отдельное фоновое задание (которые выполняются параллельно).
Минусы:
- сильно нагружает сервер (особенно если это ERP и в базе на момент запуска нет соединений, и в память каждый раз грузятся все метаданные)
- фоновые здания “плодятся” и часто это приводит к нехватке памяти и падению rphostов
- Регл. задание работает редко (раз в 5 минут, и то если упало предыдущее) а внутри регл. задания опрашиваются очереди (последовательно или параллельно) а в качестве паузы используется внешняя компонента “sleep” (т.е. интервалы опроса задаются не через расписание, а через вызов “sleep” внутри одного процесса)
Минусы:
- приходиться использовать самодельную компоненту
- баланс между оперативностью получения сообщений (параллельная обработка) и перегрузкой сервера (50 процессов которые постоянно опрашивают и пытаются забрать сообщения из 50 очередей убивают сервер) все равно приходиться искать руками