如何判断Sidekiq是否连接到Redis服务器?

21

如何使用控制台判断sidekiq是否连接到redis服务器?我希望能够像这样做:

if (sidekiq is connected to redis) # psuedo code
  MrWorker.perform_async('do_work', user.id)
else
  MrWorker.new.perform('do_work', user.id)
end
5个回答

40
您可以使用Sidekiq提供的Redis信息:

redis_info = Sidekiq.redis { |conn| conn.info }
redis_info['connected_clients'] # => "16"

这是从Sidekiq的Sinatra状态应用中获取的。


7
如果没有可用的 Redis 连接或服务器,那么 conn.info 将会抛出一个 Redis::CannotConnectError 异常。 - Leo Correa

15

我使用上面的答案将此方法添加到Rails中,如果连接成功则返回true,否则返回false

  def redis_connected?
    !!Sidekiq.redis(&:info) rescue false
  end

10

看起来你想知道在某个时刻是否有一个正在运行的 Sidekiq 进程来处理作业。使用 Sidekiq 3.0,你可以这样做:

require 'sidekiq/api'

ps = Sidekiq::ProcessSet.new
if ps.size > 0
  MyWorker.perform_async(1,2,3)
else
  MyWorker.new.perform(1,2,3)
end

Sidekiq::ProcessSet 可以提供关于任何正在运行的 Sidekiq 进程的几乎实时信息(每 5 秒更新一次)。


3
跳出@overallduka的回答,对于使用okcomputer宝石的人,这是我设置的自定义检查:
class SidekiqCheck < OkComputer::Check
  def check
    if sidekiq_accessible?
      mark_message "ok"
    else
      mark_failure
    end
  end

  private
  def sidekiq_accessible?
    begin
      Sidekiq.redis { |conn| conn.info }
    rescue Redis::CannotConnectError
    end.present?
  end
end

OkComputer::Registry.register "sidekiq", SidekiqCheck.new

1
begin
  MrWorker.perform_async('do_work', user.id)
rescue Redis::CannotConnectError => e
  MrWorker.new.perform('do_work', user.id)
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接