Может ли RabbitMQ запускать процессы для обработки очередей?
Например на PHP сайте регаются юзеры - вводят свой емей и надо на него отправить письмо. Но письма отправляются медленно и не всегда удачно. Поэтому при регистрации, задачу на отправку емейла передаём в RabbitMQ, юзеру показываем сообщение что ему отправлен емейл и PHP процесс завершается.
Можно ли RabbitMQ настроить так чтобы он как только получил задачу (сообщение) сам запустил РНР процесс для оправки емейла???
Я посмотрел татуриалы и понял так, что надо самому обеспечить запуск процессов, которые будут подключаться к RabbitMQ и ждать появления сообщений. И основное преимущество RabbitMQ перед обычной БД, в том что процессу не придётся каждую секунду слать в БД запросы - не появилось ли новое сообщение, процесс будет просто в ожидании сообщения от RabbitMQ.
Василий Банников, не на каждое, настроить его, чтобы он запускал максимум N процессов, чтобы отправка писем шла параллельно. Если писем нет, то запущено 0 процессов.
Lexxtor, кажется, что проще просто заранее запустить N процессов, которые буду подписаны на rabbitmq и ждать писем.
Повторюсь, что rabbitmq брокер сообщений, а не какой-то оркестратор, который будет сам следить за жизненным циклом процессов, которые должны обрабатывать сообщения.
Да и сам rabbitmq очень часто запущен на отдельном сервере и даже если бы умел - не смог бы запустить процесс.
Василий Банников, а если процессы упадут из-за ошибки, то очередь остановится.
1. Как сделать чтобы было всегда запущено N процессов (при падениях запускались новые)? Какие в Linux есть средства?
2. Как сделать чтобы N не превышало число писем в очереди? Чтобы процессы зря не висели.
а если процессы упадут из-за ошибки, то очередь остановится
Да. Вот за жизнью процессов и следит оркестратор.
Как сделать чтобы N не превышало число писем в очереди? Чтобы процессы зря не висели.
Какая разница? Пусть висят. В режиме ожидания они потребляют память, а не процессор. И несложно догадаться, что N не имеет смысла делать больше, чем доступно процессорных ядер, так что и суммарное потребление памяти тоже будет незначительным.
а если процессы упадут из-за ошибки, то очередь остановится
Даже systemd умеет поднимать упавшие процессы автоматически.
Вообще я хз как конкретно на линуксе красиво запустит N процессов, да и PHP не люблю. В других языках обычно запускают N потоков в рамках одного процесса.
Как сделать чтобы N не превышало число писем в очереди? Чтобы процессы зря не висели.
Сколько у тебя на машине памяти, что простаивающие процессы создают проблемы?
Запускай тогда один процесс, если хочется память сэкономить.
Перепиши отправлялку писем на другой язык, который будет жрать меньше памяти (на rust кхъ)