LoginSignup
6
8

More than 3 years have passed since last update.

Herokuでバックグラウンドジョブ実行中にDynoが再起動されるのを回避する方法

Posted at

はじめに

Herokuで構築していたアプリケーションでバックグラウンドジョブを設定していた時にたまたまDynoの再起動タイミングと重なってしまい処理がコケてしまったので、それを防ぐ方法について書いておこうと思います。

Dynoのライフサイクルについてはこちらに少し記載があります。

アプリとシステム全体の健全性を維持するため 1 日に 1 回以上再起動されます(再起動の時点で残っているリクエストは、問題なく処理されます)。複数の dyno を実行するアプリの場合、各 dyno は異なる間隔で再起動されます。

dyno の再起動は Dyno Manager によって自動的かつ透過的に行われ、ログに記録されます。スケジュールにもとづく再起動だけでなく、新しいコードがリリースされたり、アドオンが変更されたり、設定変数が変更されたりした場合も dyno は自動的に再起動されます。また、手動で dyno を再起動することもできます。

buildpackの追加

Heroku CLIを拡張するbuildpackを追加します。

$ heroku buildpacks:add https://github.com/heroku/heroku-buildpack-cli -a アプリ名

CLI用認証トークンの設定

$ heroku authorizations:create

// 上記のコマンドで返却されたトークンを以下でアプリに設定する
$ heroku config:set HEROKU_API_KEY=トークン -a アプリ名

Heroku Schedulerアドオンを追加する

// アドオン追加
$ heroku addons:create scheduler:standard -a アプリ名

// アドオンのページを開く
$ heroku addons:open scheduler -a アプリ名

Heroku Schedulerの設定

例えば以下のような構成のDynoを毎日指定時刻に再起動させたいとする
Image 2019-10-21 at 1.03.24 PM.png

アドオンページの 「Add Job」から新しいジョブを追加
すると以下のようなページが表示されるので、設定を行っていく
Image 2019-10-21 at 1.07.18 PM.png

  1. どのタイミングか
  2. コマンド
  3. Dyno size
  4. Save

を設定する。

再起動を行うコマンドですが、アプリによって設定が異なる可能性があるので、以下は参考程度に

/app/.heroku/bin/heroku restart -a アプリ名 指定のDyno

となるので、webとworkerをで一つずつジョブを作成し、それぞれのコマンド設定の項目へ以下のように設定しました。

web dyno:

/app/.heroku/bin/heroku restart -a アプリ名 web.1

worker dyno:

/app/.heroku/bin/heroku restart -a アプリ名 worker.1

以下が設定した画面です。
Image 2019-10-21 at 1.13.52 PM.png

設定する時間がUTCとなっているので、その点に注意して再起動タイミングを設定してください。

以上となります。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8