Rails 想要通过 rake task 确认 sidekiq 的状态失败

lukefan · 2015年10月03日 · 最后由 lukefan 回复于 2015年10月03日 · 2032 次阅读

想要写一个 rake task,在里面确认 sidekiq 的状态,如果 sidekiq 死掉了,就重新启动。 结果发现,rake task 和主进程是跑在不同的进程里面的,怎么跑,processes_size 都是 0。 后来在 controller 里面写了一个 action,判断 processes_size。 在 console 中 curl 去抓取,没有问题,processes_size 在正常情况下是 1。 但是在 rake 里面 curl 相同的网址,返回的就是 0 了。 只能写了一个 shell 文档,然后定时执行这个 shell,不用 rake task 了。

用 rake task 去检查 sidekiq 的运行状态不是不可以,只是不应该通过 processes_size 去检查,而应该根据 sidekiq 的进程号去检查,判断进程状态,失败则重启。

sidekiq 会意外退出,如果不是系统资源不足或者第三方依赖问题(比如 redis 挂掉,或者通讯问题)等,相当于给了你一个信号,系统里存在坑,如果不及时排查解决,定时检查重启 sidekiq 其实是治标不治本。

关于正确的 sidekiq 进程监控和管理,正确的姿势其实是用系统自带的进程管理器,比如 Ubuntu 自带的 upstart 或者更超前的 systemd 来管理进程,具体细节,sidekiq 的作者在 Blog 有一篇文章专门解释过。

http://www.mikeperham.com/2015/07/16/sidekiq-and-upstart/

我是将系统通过 docker 部署在了 digitalocean 中的一台只有 512M 内存的机器上,于是就经常会退出。 原来不适用 -d 参数,将 sidekiq 设置在一个独立的 docker 中时,没有这种问题。 但是用 -d 参数,将 sidekiq 和 webserver 跑在同一个 docker 中,就废掉了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号