yo_waka's blog

418 I'm a teapot

bowlというNode.jsのcluster管理モジュールを作った

cluster周りのコードを書いていて、ワーカー周りの死活監視やエラー処理などいつも同じようなこと書いてるのでモジュール化してみました。
bowl

GitHubにソースコードもあげてあります。
安心のテストコード付き!
waka/node-bowl

できること

  • コマンドラインスクリプトからの起動
  • ワーカーが死んだら新しいワーカーを立ち上げ
  • 停止シグナル(SIGINT, SIGQUIT)
  • SIGUSR2シグナルによるGraceful Restart(この辺にも対応
  • 指定したディレクトリ/ファイルに変更があったら再起動(Graceful Restart)
  • プラグインによるマスタープロセスの拡張
  • pidファイルの書き出し(monitなどの監視を考えて)

設定の外部ファイル化や機能のオン/オフなどもできるので、詳しい使い方はヘルプコマンドにまとめた。

開発メモ

ファイルの変更監視にはfs.watchFile、使えない環境ならfs.watchを利用します。
node-devみたいにmodule.requireを書き換えるやり方もありますが、デフォルトの挙動を差し替えるのは開発環境でしか使えないよなーと思って、ディレクトリとファイルを指定するやり方にしました。
ディレクトリは、子階層もちゃんと見るようにしています。
ただ、fs.watchFile/watchの仕様ぽいんだけど、ファイルの削除とリネームは変更イベントが起きない。ディレクトリで指定するとイベント発生するのに・・!要調査。

forkするワーカーの起動時にエラーが起きた場合は、domainのエラーハンドラでは対処出来ないので、起動後10秒以内に10回以上ワーカーのエラーが発生したら終了するようにしています。

また、Node.jsの対応バージョンが0.8.xとしているのは、ロガーとして使っているwinstonを0.9.xで動かしたところどうもファイルのtransportを使うと最初の1回しか書き込まれない現象が起きているから。
winstonは連続でログを書き込もうとしたときにキューに溜めておいて、drainイベントで書き込めるようになったら書き込みを再開するのだけど、drainイベントがなぜか発生しない。
0.9.xからはstream周りがかなり変わるみたいな話をどこかで見た気がしたので、ソースを追ってみようと思ったけどかなり複雑でちょっと後回しにしちゃった。
winstonはtransportを柔軟に設定可能なところと、ログローテートが出来る点が好きなライブラリなので、ちょっと時間ができたらちゃんと追ってみよう。

今回テスト用に初めてTravis CIを使ってみたけど、.travis.yml置いてプッシュするだけとか簡単すぎてやばい。
GitHub周りのエコシステムは仕組みといい使い勝手といい素晴らしいな。