Допустим, у меня есть очередь 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"
Это лучшая идея?