More Related Content
More from Shunji Konishi (19)
Heroku Dyno再起動時の振る舞い
- 2. Heroku上でPlay1アプリケーションを運用中
◦ Playframework 1.2.5
◦ WebDyno複数、WorkerDyno必要時のみ起動
まれにHerokuのDynoが自動再起動する際に以下のロ
グが出力されることがある
◦ Playのソースを見るとPlayがシャットダウンした後にHttpリ
クエストを受けた場合に発生するっぽい。
◦ 頻度は2週に1回程度でそれほど多くはない
これはこの問題についてHerokuのサポートチームと
やりとりした詳細の記録です。
play.exceptions.UnexpectedException: Application is not started
- 6. Playframework
◦ Playはアプリのシャットダウン前にNettyのソケットをクローズす
るべき。
◦ アプリケーション開発者がonStopなどのフックからNettyを直接
参照する方法はない。
Heroku
◦ HerokuはSIGTERMを送信したDynoに対してリクエストを送信す
るべきではない。
◦ Herokuはアプリのシャットダウン時にはまずソケットがクローズ
されることを期待している、と言えるがそれはフレームワークの
実装依存。
◦ ルータの動作はアプリケーション開発者からは制御不能な領域。
Play本体を直すことは(技術的には)可能だが、Heroku側で対
応
する方がベター。
(Play以外のフレームワークでも同じ問題があるかもしれない
し。)
しかしどの道すぐには難しそう。。。。(--
- 7. Heroku labsで公開されているβ機能
◦ https://devcenter.heroku.com/articles/labs-preboot
Prebootを適用するとDyno再起動時の動作が
◦ ルータ一時停止 -> 旧Dyno停止 ->新Dyno起動 -> ルータ再開
から
◦ 新Dyno起動 -> ルータスイッチ -> 旧Dyno停止
となる
これで万事解決か???
- 8. 対象となるDyno
◦ WebDynoのみ
◦ 少なくとも2台以上のWebDynoが起動していなければな
らない。
いつ適用されるのか?
開発者が
◦ 「git push」した場合
◦ 「heroku config:set」した場合
◦ 「heroku restart」した場合
自動再起動時は適用対象外。。。(--
Prebootは1年以上前からlabs
にあるがずっとそこからでてこ
ない。
デフォルトにした場合、一時的な
インスタンス数がかなり増えそう
なのでずっとlabsのままかも。。。
- 11. Daily at 18:30 (3:30 JST)
◦ vendor/heroku-toolbelt/bin/heroku restart web.1 -a xxx
Daily at 19:00 (4:00 JST)
◦ vendor/heroku-toolbelt/bin/heroku restart web.2 -a xxx
複数のWebDynoを時間をずらして再起動させる。
Prebootの組み合わせも有効。(というか組み合わせないと元の問題解決
にはならない)
この設定によって昼間の再起動が絶対に発生しないということではな
い。
◦ 例えばベースとなるハードウェアの障害などを検出した場合は再起動が発生す
る。
日時の再起動が必ず24時間以上のサイクルで起きるのかどうかは要検
証。
◦ 例えば4:00 AMにrestartをスケジュールした場合に、3:55 AMに自動再起動がか
かる可能性があるのではないか。
◦ Herokuサポートからは最初は「ありえる」という回答だったが、別の人は「発生
しない」という回答だった。(質問のニュアンスがどの程度正確に伝わっているか
イマイチ自信が無いので、どこまで厳密な回答なのかが判断できなんだ。。。(--)
◦ 数日テストしているが今のところ発生したことはない。