Нужно ли самому контролировать, выполнилась ли задача в очереди?
Использую расширение - yiisoft/yii2-queue.
Драйвер планирую - Redis. На базе списка.
Возьмем такую задачу - регистрация пользователя, и необходимость отправить ему письмом email с кодом подтверждения почтового ящика.
Какой видится workflow, судя по тому расширению.
1) В модели пользователь заведу флаг isEmailSent (= 0 по умолчанию), того что письмо было отправлено
2) При создании модели (insert новой записи) отправляю в очередь задачу Отправки письма - Yii::$app->queue->push(new SendEmail(['to' => $email, ...])
Теперь по крону например, будут доставаться воркером эти задачи, и каждая задача:
3) отправляет письмо
4) делает пометку пользователю, что ему отправили (isEmailSent=1)
Получается, теперь, если вдруг редис упадет и вся его инфа пропадет, то
6) по крону, по задержке, еще смотрим этих людей с isEmailSent==0, чтоб можно было им повторить отправку этой задачи в очередь.
ksnk, ну во всех доках и статьях они настаивают что на проде, надо не одну redis, а как мин несколько - master-slave держать, что как бы намекает.
Плюс вариант с персистентностью на диск, когда все записывается сразу же, может быть не прям быстрым
А можешь ли ты сам контролировать успех завершения задачи ?
Что именно им является ? Какие последствия будут от повторного ( паралельного) запуска задачи по таймауту ?
Вот на вашем примере "послать письмо активации регистрации" ?
Ты ничего не можешь проверить сам ! А успех это визит пользователя по ссылке.
А повторные письма - это спам.
Так что можно только добавить в модель поля (статус задачи и время последнего смены статуса).
Новая / Передана исполнителю / Отправлена / Подтверждено
И уже пусть пользователь сам иницирует повторную отправку, а Вы не будете ему это давать делать, если
со смены статуса прошло меньше указанного времени.
Меня больше вопрос волнует, пишут что продвинутые вещи типа rabbitmq, умеют в "подтверждение выполненной работы", но я хотел с Redis сделать, а там просто висит список задач, и их движок просто достает, выполняет код задачи и удаляет
Redis — резидентная система управления базами данных класса NoSQL, работающая со структурами данных типа «ключ — значение».
Можно извратнуться и использовать его как Вы хотите, но это именно извращение.
Воркер запускающийся по крону ? это тоже имеет право жить.
Но редис + запуски по крону = оксюрморт.
В предложенной схеме достаточно напрямую лазить в базу данных.
только флаг потребует 3х сотояний и поля времени.
1 - нужно слать
2- взял в работу
3 - отправил
У вас могут запуститься по крону несколько копий воркера паралельно.
Зачем редис - для доступа к данным менее чем за 5мс. И на фига это, если таски запускаются раз в минуту ?
Михаил, добрый вечер.
Если хотите гибкую настройку и контроль за очередями - не используйте пакеты для yii, а напрямую используйте phpamqplib + rabbitmq (например)