2016-04-13 75 views
0

我想知道是否有辦法挽救redis連接錯誤,以便我可以使用替代數據存儲來推送作業。我們使用客戶端中間件來設置當前線程用戶等,因此救援.perform_async不會有太大的幫助。另外,客戶端中間件似乎不支持錯誤處理。有什麼解決辦法可以解決客戶端中間件內部的redis連接錯誤?我能想到的方法是實施一個心跳到redis,設置一個全局標誌,將作業推送到中間件內的另一個數據存儲區。任何幫助表示讚賞。Sidekiq客戶端錯誤處理

回答

0
在配置/初始化/ sidekiq.rb

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 

constantize是不必要在Rails 4的應用程序,但我發現它需要在導軌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作業在線運行,以便輕鬆調試本地。