MariaRamona
@MariaRamona
Backend PHP developer

Очереди задач. Как лучше реализовать рассылку напоминаний о бронировании?

Есть сервис для аренды жилья на php 7.x, есть возможность бронирования на какую-либо дату в будущем. Необходимо всем, кто сделал бронь, напоминать о ней за неделю до даты заселения и за сутки до этой даты, путём рассылки e-mail.
Сервис довольно высоконагруженный, до нескольких тысяч бронирований в сутки. Поэтому тупо ставить в cron задачу при каждом бронировании не вариант.

Какие есть идеи реализации? Желательно только с использованием cron и Redis, ну и какой-либо библиотеки для redis+php.
Также нужно предусмотреть, что бронирование может быть отменено/перенесено, тогда отправка напоминания тоже отменяется/переносится.

Изначально была идея о том, что непосредственно при бронировании добавляется запись в Redis, а на cron вешается задача раз в сутки просматривать эти записи и делать рассылку напоминаний о бронированиях, срок которых подходит, но было решено рассмотреть ещё варианты.
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
akubintsev
@akubintsev
Опытный backend разработчик
Зачем использовать здесь Redis? На мой взгляд гораздо удобнее хранить очередь в СУБД в таком формате, чтобы было поле времени, после которого нужно отослать письмо.
При этом с этой табличкой можно научить работать несколько инстансов крона в параллели, для чего конечно же потребуется хранить признак is_locked.
И разумеется нужно написать отдельный крон на очистку таблички от старых отработанных заданий.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
inoise
@inoise Куратор тега PHP
Solution Architect, AWS Certified, Serverless
По cron собирайте задания с складывайте в очередь (Redis подойдёт, но лучше RabbitMQ). А с другой стороны очереди поставьте сколько нужно обработчиков и рассылайте. Создание заданий пройдет куда быстрее чем отправка множества уведомлений во внешний мир
Ответ написан
Комментировать
AlekseyNikulin
@AlekseyNikulin
недочеловек
Maria Ramona, вы можете разпараллелить процессы, чтобы в одном потоке процесс не затягивать. Создайте мастер процесс, который запустит несколько потомков.
По архитекуре сами решите, сколько записей будете выбирать. Не забудьте настроить блокировки чтения, чтобы потомки не могли прочитать уже взятые записи.
Библиотеку можно взять тут. Работает асинхронно.
Ну и существуют ряд библиотек для работы с задачами:

1. https://github.com/chrisboulton/php-resque
2. https://packagist.org/packages/woojean/php-redis-queue

Этот список не полный.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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