Ruby 微服务 - 如何在生产环境中重启/重生

Ruby microservices - how to restart / respawn in production

我目前正在将一些 Rails 功能移到一些微服务中,我不想让你厌烦这样做的原因,我只想说我们对这个决定和我们的决定感到满意架构选择。

目前还不是特别复杂,一些独立的脚本 运行ning,通过 rabbitMQ 通信,都带有一些 gem 依赖项(bunny、mysql2 等)当我通过 CLI 关闭它们时,一切都很好。

我的问题和我需要一些建议的地方是如何将它们移动到可以在失败时自动重生的守护进程。

我们目前的平台如下:

Centos 6.5 (别问) RVM 2.5.1@somegem设置 nginx 乘客 一些用户

对于 Rails,我使用 Capistrano,带有 RVM 和 Bundler 插件,它是即刻即忘,一切都已部署,如果它倒下,它会重新启动,然后我们就可以走了。

我原本以为我可以使用 respawn 将每个 ruby 微服务添加到 init 目录中。但工作永远不会开始。

如果我以另一个用户(不是 rails 某个用户)的身份连接,我会遇到 gem/rvm 问题。所以我认为这可能是一个路径问题,为了解决它我认为我们可能会丢失 rvm 并使用 bundler install --binstubs。

这可以从命令行运行,例如。 service_directory/bin/bundle 执行 service.rb

但在 init 中仍然不起作用,它们只是从状态 42 (?) 开始失败,这是我的 init conf。

start on runlevel [2345]
stop on starting shutdown

respawn

exec /home/someuser/services/some-service/bin/bundle exec /home/someuser/services/some-service/lib/service.rb

我试着用 chdir 让它更整洁,但也没有什么乐趣。

我尝试过使用 foreman,与 foreman start 一起工作正常,但创建的 upstart 导出脚本以同样的方式失败。

我尝试使用 rvm ruby 包装器作为 shebang 使它们可执行,脚本包括

require 'rubygems'
require 'bundler/setup'

我读过有关 monit 的内容,但它似乎需要我的脚本无法生成的 pids。

我确信我遗漏了一些东西,因为必须有一种简单的方法允许任何用户(包括 root 和系统用户)点击任何脚本并找到 gems 和东西运行.

提前致谢。

为了未来的我,以及任何觉得它有用的人。

我用大神解决了gem。新贵脚本仍然是一个巨大的痛苦,我无法让它按照我想要的方式工作,但我确实设法通过使用 RVM 包装器让它工作。

最终的 upstart 脚本如下所示。重要的是我尝试使用 *.god 加载多个神配置,但这只会加载第一个。最后,我只是按照其他地方的建议将每个配置块放在一个文件中,这让我们参与了游戏。

/home/someuser/.rvm/wrappers/ruby-2.5.1@agemset/god -D -P /var/run/god --log /var/log/god.log -c /home/someuser/服务/master.god

不太理想。有趣的是,你必须 运行 它作为一个前台进程,即使它在 upstart 中,但是去掉 -D 没有用。

上帝死了,子脚本不死,这有点麻烦。我怀疑有一种方法可以终止这些服务,但那是后天的事了。

它至少会在重启时启动 god 进程,而 God 会负责保持服务正常运行。