Как организовать динамическое добавление consumer-ов для rabbit-mq?
Итак, задача. Есть сервер, внутри крутятся два инстанса одного процесса
(consumer), который делает тяжелую работу, получая команду по rabbitmq. Если внутри одного сервера запускать больше 2 инстансов, все перестает работать вообще.. тупо не тянет проц.. Есть идея, если оба процесса заняты, добавлять еще один виртуальный сервер и запускать на них так же еще два таких же cosumer процесса. И так далее, пока пулл виртуалок не кончится.
Кто нибудь что то подобное решал?
Вообще с помощью rabbitmq такое решить возможно?
Я бы сделал промежуточного консьюмера, который бы просто очередь выгребал и смотрел что по свободным ресурсам. Если есть возможность (есть свободный процесс или есть возможность поднять новую виртуалку и тем самым обеспечить свободный процесс) - ставил в другую очередь, где сообщение получит уже консьюмер, который выполняет реальную задачу. Для каждого процесса можно организовать отдельную очередь по topic exchange на каждый процесс на виртуалке.
Если воркер-посредник видит, что свободных процессов нет и нет возможности поднять виртуалку - возввращать сообщение в очередь (можно через отложенную очередь).
Можно веб-сокеты. Можно в отдельную очередь ставить сообщение что такой-то воркер освободился. Можно сделать просто HTTP API куда воркер после завершения задачи будет отправлять запрос.
Я бы посмотрел в сторону веб-сокетов. Это позволит динамично управлять воркерами - останавливать их в случае необходимости, или оставлять запущенными, мониторить состояние и т.п.
Но, возможно и достаточно просто уведомления по HTTP API что "я все сделал, выключаюсь"
К очереди в RabbitMQ могут быть подключены одновременно несколько потребителей (consumers), но сам RabbitMQ никак не связан с их масштабированием. Понять, что текущие потребители не справляются со своей задачей, можно по анализу размера очереди (количеству сообщений в ней). Саму задачу масштабирования, скорей всего, надо решать на уровне какой-нибудь контейнерной виртуализации (например, docker), это будет проще и быстрей.
Да можно и докер, это пока второй вопрос. Хотя и на VPS по сути есть рулилика по API. Т.е. принципиально тут не очень много разницы, а вот по простоте да, согласен.