読者です 読者をやめる 読者になる 読者になる

ネットワークサーバじゃないプロセスでもServer::Starter経由で起動するといいことがあるかもという話

具体的には Redis の subscriber なんですが、pub/sub の pub 側が publish し続けている状態で subscriber を再起動すると、落ちてから起動までの間に来たメッセージを取りこぼす可能性があります。

pub 側を一時停止すればいいのですが、fluent-plugin-redis_publish で fluentd から publish しているので、これを止めるのはあまりやりたくない。

複数の subscriber が同時起動して処理に問題が出ないように作られていることが前提ですが、新しい subscriber を起動したら古いのを殺すようにすればいいよね? → それ Server::Starter でできるよ、という流れ。

$ start_server -- perl -e '$SIG{TERM}=sub{ warn "[$$] SIGTERM"; exit }; print "[$$] start\n"; while(1){ sleep 1; }'
start_server (pid:58347) starting now...
starting new worker 58348
[58348] start
received HUP, spawning a new worker <-- (ここで start_server に HUP )
starting new worker 58354
[58354] start
new worker is now running, sending TERM to old workers:58348
[58348] SIGTERM at -e line 1.
old worker 58348 died, status:0

今まで知らなかったのですが、start_server に port を指定しないとどのポートも bind せずに、普通に動作するんですね。

というメモでした。