ども、最近火事場案件に突っ込まれててあんまりブログ書けておりませぬ。。。(--
本当は別の記事を書きかけてるんですが、なんかHerokuからお知らせ来てたので先にそっちの話を。
なんと未来永劫labsから抜け出ることは無いんじゃないかと思っていた、prebootがGAになったようです。
https://devcenter.heroku.com/articles/preboot
結構びっくり!
ドキュメント見ると微妙にlabsの頃と挙動が違っているようなので、ざっくりとまとめておきます。
★ 使い方
新たに追加されたと思われる「heroku features」コマンドを使います。
heroku features:enable preboot heroku features:disable preboot
これまでと同様にデフォルトでは有効になっていないので使用するためには明示的にコマンドで有効化する必要があります。
また、prebootはWeb Dynoが2台以上起動していないと動作しません。
別な言い方をすれば課金しているアプリでなければ使用出来ないということです。
★ 挙動
僕の記憶によればいくつか動作に変更点があります(多分)。以下の赤字が以前とは異なる部分です。
- Slugコンパイル完了後、既存のDynoがシャットダウンされるよりも前に新しいDynoが起動する
- デプロイから約3分後、古いDynoと新しいDynoのRoutingが切り替わる
- さらにその数分後、古いDynoが削除される
- prebootはデプロイ以外の環境変数の変更や再起動時にも有効
- prebootはWeb Dynoでのみ機能し、Worker Dynoはこれまで同様シャットダウン後に新しいDynoが起動される
新しいDynoが起動してから、切り替えまで数分のタイムラグがある点と、デプロイ以外の再起動時にも有効になったと書かれている点が以前とは違います。
デプロイ完了しても数分間は旧バージョンが動き続けるというのは結構注意が必要な点かも知れません。
ざっと見た感じRoutingがスイッチしたタイミングではログがでていない気がするので、どこで切り替わったかはわからない気がします。(これは要望出そうかと思ってます。)
また、ドキュメントのこの書き方だとデイリー再起動時にもprebootは有効なように読めますが、少なくとも昨日のデイリー再起動ではprebootが行われた形跡はありません。
labsの頃は(少なくとも僕がドキュメントを精読した時には)デプロイ時以外の挙動については触れられていなかったんですが、実際には環境変数の変更やheroku restartでもprebootは効いていました。
が、デイリー再起動だけは対象外だったんですよね。。。。(--
以前にもかなりしつこくデイリー再起動時にもprebootしてくれとお願いしているので、有効になっていてくれると嬉しいんですけどね。。。
★ 注意点
ドキュメントには新Dynoのアイドル時間が増えたことによっていくつか注意点ができたことも記されています。
- これまでと違いgit pushからリターンしてもすぐには新バージョンが動かない
- preboot中はheroku psコマンドの見方に注意が必要。新旧バージョンの両方がheroku psのリストに載ることはないが、「starting」と表示されていても旧Dynoが仕事中だったりする
- 一時的にではあるが通常の2倍のDynoが起動しているのでその間RDBやRedisなどのコネクションを余分に消費する。特に安いプランで接続数が制限されている場合は注意が必要
- DBのスキーマ変更を伴う場合はprebootはうまく機能しない可能性が高い。(何故ならデプロイ後も数分旧バージョンが動くが、それが新スキーマでも変わらず動作するかどうかは不明なため)。この場合はprebootを一度無効化する必要がある
こ、これは結構微妙。。。(--
特にスキーマ変更の話は注意が必要です。
ちなみにコネクションを余計に消費する問題に対してはpgbouncer buildpackというのがお勧めらしいですが、これの話はまた今度。
個人的にはデイリー再起動で有効なのかどうかでかなり大きく評価が分かれます。
とりあえず、明日のデイリー再起動の結果を待ちたいと思います。
続報をお待ちください。(^^;
★ 追記
やっぱりデイリー再起動時にはpreboot適用されないようです。残念
ただ、デイリー再起動は24時間+αの時間で実行されるので、日本だけで使うようなサービスの場合は毎日深夜3時とかに自力でrestartをかけるのは有効かもしれません。