【发布时间】: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