gpt4 book ai didi

ruby - 是否可以在 Unicorn master 完成重启时发送通知?

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:49 27 4
gpt4 key购买 nike

我在 nginx + unicorn 后面运行一系列 Rails/Sinatra 应用程序,零停机部署。我喜欢这个设置,但 Unicorn 需要一段时间才能完成重新启动,所以我想在完成时发送某种通知。

我能在 Unicorn 文档中找到的唯一回调与 worker fork 相关,但我认为这些回调对此不起作用。

这是我从赏金中寻找的东西:老 unicorn 主人启动新主人,然后新主人开始它的 worker ,然后旧主人停止它的 worker 并让新主人接管。我想在交接完成后执行一些 ruby​​ 代码。

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

最佳答案

我以前构建过这个,但它并不完全简单。

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

下面是一个用于实现此 API 的示例 Rails Controller 。它假定 capistrano REVISION 文件存在,并在应用程序加载时将当前版本的 SHA 读入内存:

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

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

然后您可以通过您的 API 轮询本地 unicorn 的 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 结构,应用程序位于 /data/server/current 中,本地 unicorn 位于端口 8080 上。

关于ruby - 是否可以在 Unicorn master 完成重启时发送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19825189/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com