その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Jesque を頑健に使うために RobustWorkerPool というのを書いた

8/16 (日) に京都でハッカソンが催されるとの事だったので遊びに行って,表題のものを作ってきました (実際には大部分は予め作っていた).

Jesque は Resque の Java 実装版で,今やっているやつではこれを使った JobQueue - Worker なシステムの実装を進めています.
しかし Jesque Core の Worker Pooling の実装は調べてみると微妙な感じで,具体的にどう微妙かと言うと「Worker を Pooling する (つまり Worker を任意個生成する)」というところまでは面倒を見てくれるのですが,その Worker 群に対して死活監視等のマネジメントの一切をしないという問題があり,これは「不慮の事故で Worker が死んでしまった時 (Worker が poll している時に例外が上げられた時とか) にその Worker を生き返らせる」などということを全くしてくれない事を意味します.それでは不便なので,その部分を解決する実装を書いたというのが今回のハッカソンの成果となります.

これがどんなものかというと,

  • Worker を複数個生成して pooling する
  • Worker が停止したら (この時は WORKER_STOP というイベントが発火されるのでそれを hook する),
    • その Worker を pool から除去して
    • もしアクティブな総 Worker 数が最大 Worker 数を下回っていたら停止した Worker の情報を元にして新しい Worker を生成し,pool に加える
    • もしアクティブな総 Worker 数が最大 Worker 数を上回っていたら Pool から Worker を除去する (この時は Worker を Graceful に 終了させる)

- Worker が何らかのエラーを吐いてきたら (この時は WORKER_ERROR というイベントが発火されるのでそれを hook する) Graceful に当該 Worker を停止させる (停止させると WORKER_STOP が発火するので,Worker 数の調整ロジックに入る)

という動きをするように既存の Worker Pooling 機構を改良したものになります.この辺の実装は Parallel::Prefork を参考にして書いていきました.非常に参考になる……

で,実際にこれを使ってみると Worker がいきなり死んでしまっても Worker Pooling の機構自体が Worker を生き返してくれるので一定の安心感があって良い感じがしています.良い感じがしたので Maven Central にも上げるということをしました (これ,Jesque のコアでサポートして欲しいのだけれど……)


以下はハッカソンの成果発表時の資料になります.この時点では完全に酔っ払っていた事を表明します.

www.slideshare.net


ところでハッカソン会場にははてなインターンの学生が大勢いて,僕も2年前はその一員だったのだな,そういえば JobQueue についてちゃんと学んだのははてなインターンが初めてだったな,という記憶が続々フラッシュバックしてきて,そうした場で JobQueue に関連するコードを書くのはなにやら感慨深いものがありました.そうした気持ちだったので上記のスライドの前半は Resque (Jesque) 入門のような内容になっています.


ご利用下さい.