Laravel queue с несколькими рабочими серверами - 1 процесс за один раз в рабочем - PullRequest
0 голосов
/ 31 октября 2019

Допустим, у меня есть очередь Laravel, которая обрабатывает длинную задачу (5 минут) на другом сервере Node.js. Давайте назовем Node.js рабочим. Долг работника состоит в том, чтобы иметь только простой API для запуска процесса, а затем уведомить Laravel, когда он будет завершен, чтобы очередь Laravel могла быть завершена.

В будущем я хочу, чтобы гибкость порождала другой рабочий сервер, чтобы Laravel могвыберите тот, который свободен для процесса. Опять же - 1 процесс за раз на 1 работника.

У меня есть несколько вопросов об архитектуре.

Если очередь Laravel запускается так

public function handle() {
   // Find the first available worker

   // call node.js worker

   // here it needs to wait and be able to communicate with
   // node.js; otherwise the Laravel job will be completed and
   // the next job will start, right?
}

Прежде всего,Часть «Найти первого доступного работника» смущает меня, потому что, если он входит в задание очереди и не может найти ни одного доступного работника, он просто потерпит неудачу или преуспеет, а не будет ждать его, пока я не введу while(). Это плохая идея? Стоит ли вместо этого использовать планировщик для запуска заданий очереди?

Мой второй вопрос - как Laravel будет взаимодействовать с Node.js в очереди? Должен ли я использовать веб-сокеты? Что-то вроде запуска сервера веб-сокетов с каналом job_id в Laravel, и работник может подписаться и опубликовать, а Laravel может прослушать и продолжить работу? Затем я закрываю розетку. Является ли это странным подходом, если у меня одновременно запущено несколько заданий очереди (если у меня несколько рабочих серверов - поэтому Laravel попытается создать несколько подключений веб-сокетов в нескольких очередях, и это просто странно - но что, если я хочу отслеживать процессы? о процессе работника - поскольку у узла есть что-то вроде on('complete'), on.('start')).

В таком сценарии как бы вы разработали архитектуру?


Или япросто запустит очередь, пометит запись в базе данных как «обработка». Также есть другая таблица для столбцов «работник» и «статус».

// In the job:
public function handle() {
   // check if there is available worker

   // start job in worker

   while ($job->status != 'completed') {
      sleep(3);   
   }
}

И создать веб-крючок для изменения статуса задания в "/ api / {job_id} / update"

Это лучшая идея?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...