Nwht0xn1

capistrano-resqueでデプロイ時にworkerを再起動する設定を書き忘れた結果全てfailしたCreated on 2016-07-10 by r7kamura

image

https://github.com/sshingler/capistrano-resque に「Restart on deployment」という項目があり、

To restart you workers automatically when cap deploy:restart is executed add the following line to your deploy.rb:

と書かれている。即ち、デプロイ時にResqueのworkerを再起動したかったら次のコードをdeploy.rbに書いといてくれよな、と。それで、書かなかったらどうなるか。

Capistranoはデフォルトでは過去にデプロイされたコードを5回分まで保存しておいてくれるが、それ以降は古いものから順番に消してしまう。前述したコードを書かなければ、workerは再起動されないので古いコードのまま動き続け、6回目のデプロイになると遂にコードが消える。動いている最中にコードが消えてしまうものだから、あるタイミングで実装の書かれたファイルが見つけられなくなり、そこでジョブがfailする。次のジョブが即座に実行されようとするが、これらも実装が書かれたファイルが見つけられないのでfail。結果的に「Resque何も弄ってないのにデプロイしたら急にResqueが全て失敗するようになった」ということになる。

もう少し俯瞰して、これがサービスレベルでどういう問題を引き起こすか。今回はResqueを https://amakan.net/ で使っていて、Amazonの注文履歴からの一括インポート機能に利用していた。全ての注文のURLをとりあえずamakanに投げると、投げたURLごとにジョブが積まれることとなる。これが全てfailするので、ユーザからすると「一括インポートしてしばらく経つと読んだ本が増えていくと聞いていたが、一向に増える気配がない。時間が掛かっているか、失敗しているのだろうか」ということになる。自分は1時間に1度Resqueに積まれたジョブの消化具合を確認することを趣味にしているので、約1時間後にようやくこの問題に気付き、とりあえずその場で失敗したジョブを再実行し、事なきを得る (得てない)。