Самый оптимальный метод обработать задачу ровно через N секунд (миллисекунд)?

Добрый вечер. Необходимо выполнить задачу ровно через N секунд после dispatch. Задач может быть очень много от сотни до потенциального миллиона за секунду с работой через redis. Стандартный $job->delay(5) может выполниться и через 7 и более секунд, а важно выполнить именно через 5 секунд. Я так понимаю с помощью очередей данного результата добиться скорее всего невозможно. И альтернативным вариантом будет являться бесконечный цикл c асинхронным выполнением задач.

Хотел бы услышать ваши мысли по данному поводу. Заранее благодарю!
  • Вопрос задан
  • 558 просмотров
Решения вопроса 1
@troodi Автор вопроса
Задачу решил так: беконечный цикл, проверяющий задачи раз в секунду. Даже если задача отработается позже храню в базе последние значения на тот момент времени, когда должна была завершиться задача.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
darakanoit
@darakanoit
Вы запускали 1 процесс для обработки очередей?
Если я не ошибаюсь, то можно запустить необходимое количество воркеров и они будут сразу разбирать задачи.
И в теории(если я конечно прав), вы можете сделать N количество воркеров,чтобы покрыть X ваших задач и они будут исполняется в указанное время, ведь всегда будет свободный воркер.. но сколько их надо, это уже другой вопрос.
А так может стоит покурить reactphp и может быть есть какие-то импементации в ларку.
Например https://github.com/spatie/laravel-cronless-schedule
Судя по описанию, позволяет каждые 5 секунд(ниже в ридми) делать проверку задач аналогично крону. Опять таки, в теории выставить таймер ежесекундную проверку задач и исполнять их.
Как 3-й вариант посмотреть сторонние очереди(на других ЯП),которые могли бы покрыть ваши задачи.
Посыл в какую сторону курить, надеюсь дал.
Ответ написан
@Korya
#!/bin/bash

while true; do
  # Do something (php artisan queue:work --once)
  sleep 5;
done


Как вариант, и в супервизор это все.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы