仕組み上完全なホットデプロイを実現するのは難しいので、代わりに求められるのは graceful restart (継続中のセッションを切らずに再起動を行う)の方法です。とは言っても Node は基本シングルプロセス・シングルスレッドで動作するので、永遠に接続したままのセッションが存在すればいつまでたっても再起動はできません。 しかしアプリが分散環境で動作するように設計し、ある程度セッションの接続タイムアウトを許容すれば、複数プロセス間でサービスの切り替えながら実行コードを更新することができます。 3.1 http.Server.close() の挙動の理解 gracefull restart をするための一番プリミティブなAPIは http.Server.close() です。このAPIは新規 http セッションの接続を停止するだけで既存の接続セッションは継続されます。close() 後 http セッションが全てなくなると server オブジェクトで close イベントが発生します。根本的にこの仕組みを理解することが必要です。 3.2 cluster.disconnect() の利用 node-v0.8で導入された cluster の新機能では、worker プロセスの gracefull shutdown を実現する cluster.disconnect() APIが提供されました。 (内部的には server.close() 処理に合わせて子プロセスの管理をしているだけです。) これを使えば、従来より簡単に複数プロセスを使ったgracefulな処理がしやすくなります。 3.3 リクエスト毎に処理プロセスを変える LearnBoost の upモジュール のアプローチがこれです。(参考記事: Staying up with Node.JS )この仕組みでは、 httpリクエストのイベント毎に複数プロセスの別ポートに接続し、 http や ws のリクエスト処理を実行します。マスタープロセスは毎回動的に割り振りを行うだけです。 新しいコードがデプロイされたら一時的に worker へのリクエスト処理の割り振りを停止し、接続のない worker はコードを再読み込みします。マクロの見た目ではホットデプロイに最も近い方法です。接続のオーバヘッドがかかり処理性能に影響する可能性がありますが、現状ホットデプロイを実現するには最も現実的なアプローチです。
GREEが悩むNode.jsの問題を考えるヒント - ぼちぼち日記












