You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Kamal部署Rails Web及Solid Queue任务服务并解决健康检查问题

解决Kamal部署Rails Web与Solid Queue任务服务的健康检查问题

下面是几种可行的部署方案,覆盖不同场景需求:

方案1:自定义Ruby健康检查脚本

针对Solid Queue无端口的特性,编写脚本直接验证服务可用性,比如通过其依赖的Redis或内部状态判断:

  • 在项目根目录创建check_solid_queue.rb脚本:
#!/usr/bin/env ruby
require 'redis'
require 'solid_queue'

# 匹配Solid Queue的Redis配置
redis = Redis.new(url: ENV['REDIS_URL'])

begin
  # 尝试读取Solid Queue队列列表,验证服务正常
  SolidQueue::Queue.all
  exit 0 # 返回0代表健康
rescue => e
  puts "Solid Queue健康检查失败: #{e.message}"
  exit 1 # 返回1代表不健康
end
  • 赋予脚本执行权限:chmod +x check_solid_queue.rb
  • 在kamal.rb中为worker服务配置自定义健康检查:
service :worker do
  image "你的镜像标签"
  command "bundle exec rake solid_queue:start"
  healthcheck do
    command "/rails/check_solid_queue.rb"
    interval 10
    timeout 5
    retries 3
  end
end

方案2:进程存在性检查

直接检查Solid Queue进程是否在运行,逻辑简单直接:

  • 在kamal.rb中配置健康检查命令:
service :worker do
  image "你的镜像标签"
  command "bundle exec rake solid_queue:start"
  healthcheck do
    command "ps aux | grep '[s]olid_queue:start' || exit 1"
    interval 10
    timeout 5
    retries 3
  end
end

注:[s]olid_queue:start的写法是为了避免grep自身进程被误匹配,确保只检测目标任务进程。

方案3:为任务服务添加健康检查端口

通过启动一个轻量Rack服务暴露健康端点,配合进程管理工具同时运行Solid Queue和健康服务:

  • 创建config/health_check.ru文件:
run lambda { |env|
  [200, {'Content-Type' => 'text/plain'}, ['OK']]
}
  • 在项目根目录创建Procfile定义多进程:
worker: bundle exec rake solid_queue:start
health: rackup config/health_check.ru -p 3001
  • 在kamal.rb中配置用foreman启动服务,并基于端口做健康检查:
service :worker do
  image "你的镜像标签"
  command "bundle exec foreman start"
  healthcheck do
    port 3001
    path "/"
    interval 10
    timeout 5
    retries 3
  end
end

方案4:禁用健康检查(不推荐)

若任务服务稳定性极高,可临时禁用健康检查,但会丢失Kamal自动重启故障进程的能力:

service :worker do
  image "你的镜像标签"
  command "bundle exec rake solid_queue:start"
  healthcheck false
end

内容的提问来源于stack exchange,提问作者Encore PTL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:04:58