我想知道是否有办法解决redis连接错误,以便我可以使用备用数据存储来推送作业。我们使用客户端中间件来设置当前线程用户等,因此抢救.perform_async不会有太大帮助。此外,客户端中间件似乎不支持错误处理。是否有某种解决方法可以解决客户端中间件中的redis连接错误?我能想到的方法是实现redis的心跳,设置一个全局标志,将作业推送到中间件内的替代数据存储区。任何帮助表示赞赏。
答案 0 :(得分:1)
:
class SidekiqErrorHandler
def call(worker_class, job, queue, redis_pool)
begin
Sidekiq.redis {|conn| conn.ping}
yield
rescue
klass = worker_class.constantize
klass.new.perform(*(job['args']))
false
end
end
end
在Rails 4应用中,constantize
是不必要的,但我发现最近在Rails 5应用中需要它。
Sidekiq.configure_client do |config|
config.redis = { :size => 1 }
config.client_middleware { |chain| chain.add SidekiqErrorHandler } unless Rails.env.test?
end
这也很方便(在同一个文件中):
if Rails.env.development?
require 'sidekiq/testing'
Sidekiq::Testing.inline!
end
这允许sidekiq作业在线运行,以便在本地轻松调试。