加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > Nginx > 正文

ruby – 当Unicorn主机完成重启时是否可以发送通知?

发布时间:2020-12-13 21:32:11 所属栏目:Nginx 来源:网络整理
导读:我在nginx独角兽后面运行一系列Rails / Sinatra应用程序,零停机时间部署.我喜欢这个设置,但Unicorn完成重启需要一段时间,所以我想在完成后发送一些通知. 我可以在Unicorn docs中找到的唯一回调与worker forking有关,但我不认为那些会对此有用. 这就是我从赏

我在nginx独角兽后面运行一系列Rails / Sinatra应用程序,零停机时间部署.我喜欢这个设置,但Unicorn完成重启需要一段时间,所以我想在完成后发送一些通知.

我可以在Unicorn docs中找到的唯一回调与worker forking有关,但我不认为那些会对此有用.

这就是我从赏金中寻找的东西:旧的独角兽大师启动新的主人,然后启动它的工人,然后旧的主人停止其工人并让新的主人接管.我想在切换完成时执行一些ruby代码.

理想情况下,我不想实现任何复杂的流程监控来执行此操作.如果这是唯一的方式,那就这样吧.但是在我走这条路之前我正在寻找更简单的选择.

最佳答案
我之前已经构建过这个,但它并不完全简单.

第一步是添加一个API,返回部署的当前代码版本的git SHA.例如,您部署AAAA.现在您部署BBBB并将返回.例如,假设您添加了返回SHA的api“/ checks / version”.

这是一个用于实现此API的示例Rails控制器.它假设存在capistrano REVISION文件,并在app加载时将当前版本SHA读入内存:

class ChecksController
  VERSION = File.read(File.join(Rails.root,'REVISION')) rescue 'UNKNOWN'

  def version
    render(:text => VERSION)
  end
end

然后,您可以通过API轮询本地独角兽以获取SHA,并等待它更改为新版本.

以下是使用Capistrano的示例,它将正在运行的应用版本SHA与新部署的应用版本SHA进行比较:

namespace :deploy do
  desc "Compare running app version to deployed app version"
  task :check_release_version,:roles => :app,:except => { :no_release => true } do
    timeout_at = Time.now + 60
    while( Time.now < timeout_at) do
      expected_version = capture("cat /data/server/current/REVISION")
      running_version = capture("curl -f http://localhost:8080/checks/version; exit 0")

      if expected_version.strip == running_version.strip
        puts "deploy:check_release_version: OK"
        break
      else
        puts "=[WARNING]==========================================================="
        puts "= Stale Code Version"
        puts "=[Expected]=========================================================="
        puts expected_version
        puts "=[Running]==========================================================="
        puts running_version
        puts "====================================================================="
        Kernel.sleep(10)
      end
    end
  end
end

您需要调整轮询的超时/重试次数以匹配平均应用启动时间.此示例假定为capistrano结构,其中app为/ data / server / current,端口为8080的本地独角兽.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读