MariaRamona
@MariaRamona
Backend PHP developer

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

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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
от 150 000 руб.
ManyChat Москва
от 180 000 до 250 000 руб.
Telecom Club Санкт-Петербург
от 120 000 руб.
21 июл. 2019, в 16:20
10000 руб./за проект
21 июл. 2019, в 16:04
1000 руб./за проект
21 июл. 2019, в 15:45
1500 руб./за проект