【问题标题】:Ruby microservices - how to restart / respawn in productionRuby 微服务 - 如何在生产中重新启动/重生
【发布时间】:2019-02-11 09:27:02
【问题描述】:

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

目前它并不是特别复杂,运行少数独立脚本,通过 rabbitMQ 交谈,当我通过 CLI 启动它们时,它们都具有一些 gem 依赖项(bunny、mysql2 等),一切都很好。

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

我们目前的平台如下:

Centos 6.5(不要问) RVM 2.5.1@somegemset nginx 乘客 某用户

对于 Rails,我使用带有 RVM 和 Bundler 插件的 Capistrano,它是一劳永逸的,一切都会被部署,如果它摔倒了,它会重新启动,然后我们就走了。

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

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

这适用于命令行,例如。 service_directory/bin/bundle exec 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 让它更整洁,但那里也没有任何乐趣。

我尝试使用工头,在工头启动时工作正常,但创建的新贵导出脚本以同样的方式失败。

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

require 'rubygems'
require 'bundler/setup'

我已经阅读了有关 monit 的信息,但这似乎需要我的脚本不生成的 pid。

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

提前致谢。

【问题讨论】:

    标签: ruby rvm bundler microservices production


    【解决方案1】:

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

    我通过使用上帝宝石解决了它。 upstart 脚本仍然是一个巨大的痛苦,我无法让它按照我想要的方式工作,但我确实设法通过使用 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

    这并不理想。有趣的是,您必须将它作为前台进程运行,即使它在新贵之内,但取出 -D 不起作用。

    如果上帝死了,子脚本不会死,这有点讨厌。我怀疑有办法终止服务,但那是另一天。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2018-07-04
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多