100% надежный тактовый процесс на Heroku?

Я использую Rails 5 на Heroku для очень экономичного приложения для обработки платежей, которое будет выполнять большие объемы обработки.

Приложение не имеет большого функционала, поэтому оно размещается там. Тем не менее, одна вещь, которую он должен делать на 100% надежно, — это запускать задания по обработке платежей и запускать определенные из них только один раз. Если не 100% (потому что нет ничего идеального), то 99,9999%.

Я выбрал Delayed Job вместо Sidekiq для этой дополнительной целостности базы данных. Я также планировал использовать драгоценный камень Clockwork.

После прочтения проблем кажется, что есть много проблем с тактовыми процессами, запускаемыми много раз при перезапуске dynos.

Мне интересно, как лучше всего решить эту проблему с помощью Rails/Heroku. Как я могу очень, очень надежно запускать определенные задания только один раз, несмотря на перезапуски и что-то еще?


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

Я также говорю о расписании заданий из действия Rails (это будут критические задания). Возможно ли, что перезапуск web dyno предотвратит отложенное задание от планирования задания из моего кода, если оно перезапустится в середине действия?


person Tallboy    schedule 14.09.2016    source источник


Ответы (1)


С государственной машиной. Вы устанавливаете состояние задания на :pending при его создании. Когда задание начнет выполняться, измените состояние на :running. Когда задание завершится, измените состояние на :complete. Запускайте задания только тогда, когда они находятся в состоянии :pending и имеют отдельный пакетный процессор, который проверяет :running заданий, для которых истекло время ожидания. Таким образом, когда задания были уничтожены до завершения, вы можете перезапустить их.

person Andy Gauge    schedule 14.09.2016
comment
Аааа, я вижу, это имеет смысл. Можете ли вы также взглянуть на мое дополнение выше к моему первоначальному вопросу? (Я забыл сказать это раньше) - person Tallboy; 14.09.2016
comment
Вы хотите, чтобы одни и те же состояния существовали в ваших повторяющихся заданиях. Отличие заключается в том, что когда вы устанавливаете задание на завершение, вы создаете новое задание как ожидающее (или вы можете установить состояние ожидания с новым временем начала). Я предпочитаю создавать новое задание, чтобы вы могли видеть историю выполнения заданий. - person Andy Gauge; 14.09.2016
comment
Кстати, я уже использовал этот гем раньше github.com/pluginaweek/state_machine с sidekiq для создания надежные рабочие места. Я уверен, что отложенная работа работает так же хорошо с ним. - person Andy Gauge; 14.09.2016