bizzi
@bizzi
junior php web developer

Как сделать таймер для каждой записи в БД?

Всем привет!
Есть интернет магазин на Laravel 4.2, база MySQL и мобильное приложение (для курьеров).
Каждый заказ должен быть доставлен в течении ограниченного времени. Т.е. нужен таймер. По истечении ограниченного времени нужно посылать пуш уведомления на мобильники, а в базе заказ помечать как просроченный.
Интересно, как это можно реализовать?
Причем суть в том что заказчик хочет чтобы таймер был именно на сервере тк клиенту он не доверяет :)
  • Вопрос задан
  • 1460 просмотров
Решения вопроса 1
JhaoDa
@JhaoDa
LaravelRUS Team
К предложенным вариантам можно добавить очереди: создали заказ, добавили в очередь задание с нужной задержкой. Задание срабатывает, помечает заказ и отправляет уведомление. Если заказ доставлен до того, как сработало задание, то задание можно удалить (не все серверы очередей поддерживают).
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
1. Создать cron-команду, которая будет проверять просроченность и посылать уведомления.
2. Профит.
Ответ написан
Комментировать
magalex
@magalex
Архитектор распределённых систем управления
Таки вещи реализуются с помощью планировщика задач cron
Ответ написан
Комментировать
@AlexGx
Yii2 developer, business analytics
Вариантов реализации много, использование очереди с таймерами, получение эвентов от бд, написание своего сервиса, отвечающего за это, крон. Я бы реализовал консольный скрипт который просыпается раз в 20-30 секунд (думаю большая точность не нужна) и обрабатывает записи из бд, рассылает пуши и тд.
Ответ написан
Комментировать
akubintsev
@akubintsev
Опытный backend разработчик
В сущности лучше всего видится использование сервиса на основе event loop. Технически - libevent. Вокруг этой библиотеки есть и Node.js, и ReactPHP, и прочие ЯП. Хорошо это тем, что не грузит систему. Соответственно, можно довольно легко написать своего демона, который будет регистрировать таймеры и выполнять обработчики (типа onExpire, getRemainingTime).
Для связи с демоном использовать менеджер очередей, например ZeroMQ или RabbitMQ, или Redis
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы