@guyasyou

Как организовать одну очередь задач между разными серверами?

Здрасти!
Нужно сделать веб-приложение, которое работает по API "асинхронно", то-есть запросы по API не требуют незамедлительного ответа.

Вот как я его щас представляю
5b55e2742b948748187406.png

Работу по обработке запросов выполняются сервера 1, 2, 3 ... Эти сервера только читают MySQL, писать им ничего не нужно.

Запрос в API перекидывается одному из серверов, тот помещает задачу в очередь. А воркеры берут доступную задачу и выполняют.
Так вот, как организовать единую очередь между серверами, чтобы :
  • одна задача бралась только одним воркером
  • задача вставленная в очередь одним сервером могла быть исполнена любым другим
  • падение одного сервера никак не влияла на работу других


Для организации очереди я рассматривал Redis. Но я так понял что он работает по принципу master-slave, а мне нужно чтобы серверы были самодостаточны. Может что другое предложите?

Ну или вообще архитектура неверно построена?
Скорость не так важна, главное иметь возможность легко маштабировать и надежность.
  • Вопрос задан
  • 584 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Doc44
Есть специализированные сервера очередей.
Зачем всюду совать Redis и рулить очередь под ним вручную.

RabbitMQ, к примеру.
Ответ написан
@RidgeA
Мне не совсем понятна задач очереди внизу схемы.

Есть веб-интерфейс, которые принимет запрос и ставит задачу в очередь.
Есть N воркеров (+ в RabbitMQ в том, что воркеры можно поднимать и опускать динамически, в зависимости от нагрузки) которые подписаны на очередь. RabbitMQ по round-robin раздает на воркеров сообщения. Можно регулировать количество сообщений, которые воркер может обрабатывать за раз и использовать в режиме подтверждения сообщений (если воркер не сказал что ок - сообщение вернется в очередь)
После обработки задачи воркер вносит изменения в базу.
Веб-интерфейс может свободно читать базу и узнать, обработана задача или нет.
Ответ написан
Ваш ответ на вопрос

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

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