Действие по наступлению определенного времени

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
theorist
Сообщения: 70
Зарегистрирован: 2012.12.24, 00:30
Откуда: Киев

Действие по наступлению определенного времени

Сообщение theorist »

Всем привет.
Есть скрипт, который продает товары, но не постоянно, а до какого-то момента (например, до 14:05 сегодняшнего дня по серверному времени).

Нужно, чтобы в фоновом режиме вызывалась определенная функция после того, как это время наступило.
Конечно, самый просто вариант - это Крон, который с интервалом в минуту проверяет товары, время действия которых закончилось и деактивирует их сам, а можно, чтобы юзер это делал, когда открывает страничку товара, но эти варианты не совсем подходят.

Возможно (а я уверен, что это так), существует более изящное решение?
В технологиях на ограничен, будет VPS.

Спасибо.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Действие по наступлению определенного времени

Сообщение yan »

чем крон не изящен?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Действие по наступлению определенного времени

Сообщение zelenin »

почему в коде не проверять бизнес-требование? вы что кроном собираетесь статус менять?
Аватара пользователя
theorist
Сообщения: 70
Зарегистрирован: 2012.12.24, 00:30
Откуда: Киев

Re: Действие по наступлению определенного времени

Сообщение theorist »

zelenin писал(а):почему в коде не проверять бизнес-требование? вы что кроном собираетесь статус менять?
Код что-то должно вызвать. Если не юзер в браузере, то что? Нужно что-то типа коллбэка по наступлении определенного времени.

Если Крон - единственное решение, то ок.
Спросить-то можно. :-)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Действие по наступлению определенного времени

Сообщение zelenin »

theorist писал(а):
zelenin писал(а):почему в коде не проверять бизнес-требование? вы что кроном собираетесь статус менять?
Код что-то должно вызвать. Если не юзер в браузере, то что? Нужно что-то типа коллбэка по наступлении определенного времени.

Если Крон - единственное решение, то ок.
Спросить-то можно. :-)
я не пойму, что вы усложняете? если время 14:05 настало, выбираете из базы только те товары которые можно показывать на фронте. Так же делаете проверку в самом товаре, чтобы нельзя было его купить, если страницу с товаром открыли например в 14:03. Зачем тут крон? это неверный подход.
Аватара пользователя
theorist
Сообщения: 70
Зарегистрирован: 2012.12.24, 00:30
Откуда: Киев

Re: Действие по наступлению определенного времени

Сообщение theorist »

zelenin писал(а):
theorist писал(а):
zelenin писал(а):почему в коде не проверять бизнес-требование? вы что кроном собираетесь статус менять?
Код что-то должно вызвать. Если не юзер в браузере, то что? Нужно что-то типа коллбэка по наступлении определенного времени.

Если Крон - единственное решение, то ок.
Спросить-то можно. :-)
я не пойму, что вы усложняете? если время 14:05 настало, выбираете из базы только те товары которые можно показывать на фронте. Так же делаете проверку в самом товаре, чтобы нельзя было его купить, если страницу с товаром открыли например в 14:03. Зачем тут крон? это неверный подход.
Возможно, я не совсем верно описал задачу.
Условно - как только время действия товара закончилось, я должен юзерам, попытавшимся его купить, начислить бонус. Если бы стояла задача просто не показывать на сайте, то я бы не просил советов, а так я должен вызвать функцию, у которой свое назначение и своя бизнес-логика относительно этих товаров.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Действие по наступлению определенного времени

Сообщение zelenin »

тогда все верно - действие товара закончилось, кроном начисляем бонусы.
Аватара пользователя
theorist
Сообщения: 70
Зарегистрирован: 2012.12.24, 00:30
Откуда: Киев

Re: Действие по наступлению определенного времени

Сообщение theorist »

zelenin писал(а):тогда все верно - действие товара закончилось, кроном начисляем бонусы.
Кроном нельзя ведь конкретное время назначить? Там только интервалы?

Или есть способ после сохранения товара запихнуть время его окончания в crontab?
Есть какой-нить best practice относительно моей задачи?
Последний раз редактировалось theorist 2016.06.07, 14:24, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Действие по наступлению определенного времени

Сообщение zelenin »

время можно. если у вас даты разные и постоянно крон вручную редактировать неудобно, я бы рассмотрел очереди задач.
Аватара пользователя
theorist
Сообщения: 70
Зарегистрирован: 2012.12.24, 00:30
Откуда: Киев

Re: Действие по наступлению определенного времени

Сообщение theorist »

zelenin писал(а):время можно. если у вас даты разные и постоянно крон вручную редактировать неудобно, я бы рассмотрел очереди задач.
Да, даты разные.
Я так понимаю, в сервер очереди задач я могу поставить задачу типа "set_bonuses" и передать id-шник товара + указать время выполнения?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Действие по наступлению определенного времени

Сообщение zelenin »

theorist писал(а):
zelenin писал(а):время можно. если у вас даты разные и постоянно крон вручную редактировать неудобно, я бы рассмотрел очереди задач.
Да, даты разные.
Я так понимаю, в сервер очереди задач я могу поставить задачу типа "set_bonuses" и передать id-шник товара + указать время выполнения?
нет, в классике вы по наступлению какого-то триггера (сохранение товара) отправляете в очередь задачу setBonuses. Очередь кидает задачу в воркер, который выполняет задачу. Все это в риалтайм. Задержки какие-то можно самому добавить в своей реализации.
Аватара пользователя
theorist
Сообщения: 70
Зарегистрирован: 2012.12.24, 00:30
Откуда: Киев

Re: Действие по наступлению определенного времени

Сообщение theorist »

Спасибо, что вы откликаетесь на мои сообщения, но я, все же, не полностью понимаю.
Опишу цепочку действий.

1. Я создаю товар и ставлю время окончания, например, сегодня в полночь;
2. Юзеры наколбасили на него предзаказов;
3. Ровно в полночь я этим юзерам начислил бонус.

Триггер выкинется один раз при создании товара, но как я кину задачу в очередь? Ведь мне не нужно, чтобы она сейчас выполнилась. Нужно именно в полночь, как только срок действий закончился.

Юзеры могут в это время не открывать товар (так бы можно было инициировать отправку таска в очередь в этот момент, если время вышло).
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Действие по наступлению определенного времени

Сообщение ElisDN »

> Ровно в полночь я этим юзерам начислил бонус.

Ну раз один раз ровно в полночь, то просто поставить cron на полночь. А то все подумали, что Вам каждую минуту надо их проверять.
Последний раз редактировалось ElisDN 2016.06.07, 14:44, всего редактировалось 1 раз.
Аватара пользователя
theorist
Сообщения: 70
Зарегистрирован: 2012.12.24, 00:30
Откуда: Киев

Re: Действие по наступлению определенного времени

Сообщение theorist »

ElisDN писал(а):> Ровно в полночь я этим юзерам начислил бонус.

Ну раз один раз ровно в полночь, то просто cron на полночь.
Это для простоты примера. Может срок действия товара закончиться завтра в 14:06.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Действие по наступлению определенного времени

Сообщение zelenin »

итак: у вас есть товары с датой окончания. Каждые 10 минут вы выбираете все товары, которые закончили свое действие в последние 10 минут. На каждый товар создаете задачу SetBonuses($productId); и отправляете в очередь (можно и без очереди, но команда будет выполняться долго при росте покупателей и товаров - предвосхитите это). Очередь почти моментально (зависит от кол-ва задач в очереди) кинет все это в воркеры, которые произведут расчет.
Аватара пользователя
theorist
Сообщения: 70
Зарегистрирован: 2012.12.24, 00:30
Откуда: Киев

Re: Действие по наступлению определенного времени

Сообщение theorist »

zelenin писал(а):итак: у вас есть товары с датой окончания. Каждые 10 минут вы выбираете все товары, которые закончили свое действие в последние 10 минут. На каждый товар создаете задачу SetBonuses($productId); и отправляете в очередь (можно и без очереди, но команда будет выполняться долго при росте покупателей и товаров - предвосхитите это). Очередь почти моментально (зависит от кол-ва задач в очереди) кинет все это в воркеры, которые произведут расчет.
Спасибо, выглядит неплохо.
Хотелось, конечно, чтобы срабатывал какой-то коллбэк, но есть подозрения, что моя задача не решается в тот способ, который я себе придумал.

Мужики, спасибо всем, как минимум одно решение есть, благодаря вам.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Действие по наступлению определенного времени

Сообщение zelenin »

theorist писал(а):Спасибо, выглядит неплохо.
Хотелось, конечно, чтобы срабатывал какой-то коллбэк, но есть подозрения, что моя задача не решается в тот способ, который я себе придумал.
очередь задач - это собственно обычный паттерн, с которым вы часто встречались на разных сервисах. Тот же самый интернет у вас никогда не отрубается в 0:00, а всегда в 2-3 часа ночи)
Аватара пользователя
theorist
Сообщения: 70
Зарегистрирован: 2012.12.24, 00:30
Откуда: Киев

Re: Действие по наступлению определенного времени

Сообщение theorist »

zelenin писал(а):
theorist писал(а):Спасибо, выглядит неплохо.
Хотелось, конечно, чтобы срабатывал какой-то коллбэк, но есть подозрения, что моя задача не решается в тот способ, который я себе придумал.
очередь задач - это собственно обычный паттерн, с которым вы часто встречались на разных сервисах. Тот же самый интернет у вас никогда не отрубается в 0:00, а всегда в 2-3 часа ночи)
Никогда раньше об этом не задумывался. :-)
Ответить