2016-04-13 10 views
0

redis接続エラーを救済する方法があるかどうかを知りたいので、代替データストアを使用してジョブをプッシュできます。私たちはクライアント側のミドルウェアを使って現在のスレッドのユーザーなどを設定しています。したがって、.perform_asyncを救済することはあまり役に立ちません。また、クライアントサイドミドルウェアはエラー処理をサポートしていないようです。クライアントミドルウェア内の接続エラーを救済できる回避策がありますか?私が考えることのできるアプローチは、ミドルウェア内の代替データストアにジョブをプッシュするためのグローバルフラグを設定し、レディスにハートビートを実装することでした。どんな助けもありがとうございます。設定/初期化子/ sidekiq.rbでSidekiqクライアントエラー処理

答えて

0

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アプリでは不要でしたが、私はそれが最近、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ジョブは、インラインで実行することができます。