Запуск непрерывно работающего рабочего процесса на Heroku

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

Желательно, чтобы яЯ хотел бы назначить только этот единственный вызов метода для dyno, так что, когда мое приложение загружается, оно запускает дополнительный рабочий-dyno, а затем вызывает мой единственный метод и начинает гудеть. Но не знаете, как назначить вызов этого метода?

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

 Thomas Klemm10 окт. 2012 г., 19:05
Частые запросы HTTP могут заставить вас выбратьSidekiq в качестве фонового рабочего вместо отложенного задания, которое может выполнять их неблокирующим образом в сочетании с потокобезопасным HTTP-клиентом, таким какэтот особенный, Тем не менее, яЯ опубликую ответ ниже, который может получить больше к тому, что вы ищете.
 Carson Cole10 окт. 2012 г., 16:58
@ThomasKlemm Это приложение состояния сервера, поэтому процесс отслеживает несколько приложений и делает частые HTTP-запросы.
 Thomas Klemm10 окт. 2012 г., 12:02
Не могли бы вы привести пример того, что может сделать этот длительный процесс?

Ответы на вопрос(1)

Решение Вопроса

ительной рабочей работы

# Procfile
web: ...
worker: ...
collector: bundle exec ruby stats_collector.rb -p $PORT # or any other command

Затем вы можете масштабировать этот процесс с$ heroku ps:scale collector=1, Он будет работать отдельно и будет останавливаться и перезапускаться при каждом развертывании. Я'Я бы сказал, что то, что делает ваше приложение, должно быть безопасным, чтобы его можно было прервать в любое время, чтобы использовать такой длительный процесс.

Если перерывы могут привести к проблеме (например, то, что вы хотите сделать только один раз, выполняется дважды, если перезапущено)традиционный» фоновый работник, использующий, например,Sidekiq что очереди сообщений могут быть более безопасным решением.

Обновить

Если вы хотите выполнять долго выполняющийся код неинтерактивно в контексте вашего приложения на Rails, вы можете использоватьрельс бегун команда.

# Procfile
web: ...
worker: ...
collector: bundle exec rails runner 'MyModel.my_long_running_job'
 Carson Cole10 окт. 2012 г., 22:35
Я думаю, что это будет работать отлично. Мой рабочий процесс может обрабатывать несколько потоков HTTP-запросов, и я думаю, что эта командаискал!
 abhir05 июн. 2013 г., 04:48
очень полезный ответ - спасибо !!
 januszm27 сент. 2013 г., 17:25
Можно'не найти информацию о процессе сбора. Будет ли он убит через 24 часа, как динозавры? Мне нужно запустить непрерывный процесс, который длится более 24 часов.
 Thomas Klemm29 сент. 2013 г., 10:37
@januszm Процесс сбора - это просто динамо с нестандартным именем процесса. Это будет рассматриваться как все процессы / процессы.
 Carson Cole10 окт. 2012 г., 23:22
Получил сборщик, но изо всех сил пытался получить метод Class.metrod из моего приложения. Вызов только файла ruby.rb (stats_collector в вашем примере), только запускает код (не зная никаких других классов) в этом файле, или я что-то упустил?
 Carson Cole12 окт. 2012 г., 05:37
Никогда не пробовал rails runner, а вместо этого помещал колл в задачу rake, которую я использовал в сборщике. Отладка рабочего Heroku - это сложная задача, но теперь она работает как шарм. Благодарю.
 Thomas Klemm10 окт. 2012 г., 23:46
Я думаю, что обновление в том числеrails runner могу помочь тебе. Пожалуйста, сообщите, если это сработало.

Ваш ответ на вопрос