задачи для cron в docker

WMix

герр M:)ller
Партнер клуба
Расскажу про кейс который меня привел к крону. Есть повторяющиеся заказы, ритм повторения задает пользователь. Предложено этот ритм сгенерить и скормить типа crontab -f /myfile. Дальше игра в докеры, получили запрос на fpm, передали на redis, его прочел cli. Задача перегенерили файл (команда выше). Далее сам крон в нужный момент кидает в редис задачу «заказать» и сам же считывает и выполняет.
Я cli на дебиане собрал, с альпиновскими танцами отказался
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@WMix все зависит от ситуации
Когда покупатель придет и скажет, что он заявку оформил, а вы покупку не обработали, вопрос будет в суммах потерь.
Если цена вопроса на уровне хотя бы тысяч долларов, логи становятся важными, а в твоей схеме их не видно.
 

WMix

герр M:)ller
Партнер клуба
Ритм пользователь задает днями, крон работает поминутно. Исполнить заказ надо до утра, иначе не успеют обработать на складе. Выбрать время поставить задачу «перегенерить» я смогу. (Меняют ритмы достаточно редко, если 1 раз в месяц то хорошо. Чаще когда появилась новый или продали старый «обьект/адрес»)

В 6 утра крон просто пишет задачу в очередь «исполни заказ 100500»

Обработчик который примет задачу конечно пишет лог. (В куче логирование 3 раза access.log и 2х в app.log (перегенерить и исполнить)

В предыдущем сообщении вместо редис говорилось о rabbitMQ
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Конфигурация крона статическая, а эта штука динамическая. Плюс, если несколько инстансов, как определить, чьи тапки?

Я бы такое иначе решал - сделал демона, который либо в базу ходит регулярно за "расписанием", либо получает инструкции через какую-нибудь очередь (те же redis streams подойдут).
 

WMix

герр M:)ller
Партнер клуба
тоже прихожу к мысли что решение через корон не самое лучшее. Не то чтоб много расчетов «еженедельно по вторникам», или «каждый третий день начиная от 5го» и тд.

Меня убедили что этот кейс «к примеру» и админу будет удобен, другие задачи аппликации которые действительно по крону стартуют, редактировать
 

fixxxer

К.О.
Партнер клуба
Это как, править crontab и пересобирать докер-образ?
Да ну нафиг, забудьте про крон, он в концепцию 12 factor apps не вписывается ваще
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
вынес - это отдельная тема

@Adelf давай сделаем раздел docker на форуме? или добавим его в тему про хостинг, не знаю. Треть тем последнее время с ним связана.
 

WMix

герр M:)ller
Партнер клуба
Это как, править crontab и пересобирать докер-образ?
Я выше писал, сгенерили файл и отдали команду crontab -f /file

На debian писал sudoers чтоб запустить crond root’ом в CMD секции docker, а дальше crontab -f от имени пользователя сразу после создания новой таблицы.
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@WMix здесь три проблемы:

1. Это SPOF. ЕслиКогда сервер с кроном упадет или ребутнется невовремя, заказы не будут оформлены.
Когда поломается дисковая подисисема, пропадут crontab-файлы, и все заказы перестанут оформлятся вообще.
Если делать бекап, те заказы, которые были отменены за день после бекапа, будут оформлены, и будут конфликты.
То есть, решение ненадежное, подходит только для небольшого бизнеса, когда заказы можно перевести на обработку вручную.

2. Схема с кроном не подходит для автоматических списаний с карт. Когда клиент пожалуется на то, что не смог отменить подписку, или что вы списали лишние деньги, я не представляю, как ты отследишь в каком месте системы был сбой. У тебя не будет сквозного идентификатора события во всех обработчиках. Проблемы придется решать личным вниманием руководителя, молча возвращать деньги. Как потеряете несколько тысяч евро - поймете, что переписать придется.

3. Это не подходит для проекта с несколькими временными зонами с разными датами перехода на летнее время - например, США.
 

fixxxer

К.О.
Партнер клуба
сгенерили файл и отдали команду crontab -f /file
где сгенерили? куда отдали?
ничего, что в докере ничего не персистится?

раздел docker на форуме
скорее что-нибудь типа devops, не создавать же форумы на каждую очередную технологию. ;)
 

WMix

герр M:)ller
Партнер клуба
Сидим на cli (while true) слушаем очередь, приходит запрос «перегенери файл», запускается worker, читаем базу, генерим файл, отдаем crontab.
Приходит время, крон кидает задачу в очередь «создай заказ 100500», запускается worker, читает базу, создает заказ.

Да, если сервер ребутнется, будет проблема, запускать ручками или просто сдвинь время с 6 на 7 к примеру

Если ты оформил подписку, значит так хотел. Чтоб отменить ее, просто отмени, файл перегенерится и твоя подписка исчезнет

Файл сразу после crontab -f file можешь удалять, он больше не нужен он всегда заного сгенерится

100500 это не сам заказ, а шаблон заказа
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
В контейнере не может быть инит-системы (технически, конечно, никто не запретит, но это против самой сути докера). Тут единственным вменяемым вариантом будет взаимодействие двух контейнеров - crond и его "контроллера", который этот твой самый while true. (Это, кстати, нормально, у меня так, например, letsencrypt работает).

В этом случае с рестартом проблем никаких нет ("контроллер" прямо при запуске сгенерирует и обновит crontab).

Проблема тут именно с локальным состоянием. Как запустить хотя бы два таких инстанса, которые будут резервировать друг друга и при этом не конфликтовать?

С очередью все понятно - сколько угодно consumer-ов, кто первый схватил - того и тапки. А тут как?

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

WMix

герр M:)ller
Партнер клуба
Конечно хотим много фпм и демонов, хотя со вторыми проблем пока нет, а фпм критично уже. Но даже в этом случае поставлю крон один раз, как отдельный сервис. И все сидим просто на очереди. На самом деле крон может всегда себе прописывать строчку на минуту перед «6 часов» обнови таблицу. (Ну или командой).. Пхп там больше нужен чтоб пароли и клиенты смапить.

Те. Проблему кто обработает, я не понимаю, «кто из очереди забрал тот и обработал»
 

WMix

герр M:)ller
Партнер клуба
А если такое резервирование не нужно, зачем вам докер-то вообще? В количестве 1 штука что докер-образ собрать,
Да просто чтоб весь енв поднять за раз, не более.. это же часть аппликации? Мастер база тоже одна
 

WMix

герр M:)ller
Партнер клуба
А вобщем можно и по крону на конкретный тип задачи иметь, не вижу проблему
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
для начала вам просто пофиг что будет когда система ляжет, остальное - просто следствие
например, сидим на cli (while true) слушаем очередь - а что будет когда процесс завис?

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

fixxxer

К.О.
Партнер клуба
ну это можно было и раньше (только сложнее), через всякие там cfengine

докер своими ограничениями заставляет правильно думать об архитектуре
 
Сверху