2016-04-13 31 views
0

Redis bağlantı hatalarını kurtarmanın bir yolu olup olmadığını bilmek istiyorum, böylece işleri zorlamak için alternatif bir veri deposu kullanabilirim. Geçerli iş parçacığı kullanıcısını ayarlamak için istemci taraf ara katman yazılımını kullanıyoruz, bu nedenle kurtarmaya .perform_async çok fazla yardımcı olmaz. Ayrıca, istemci tarafı aracı yazılımı hata işlemeyi desteklemiyor gibi görünüyor. Bir şekilde istemci middleware içinde redis bağlantı hataları için kurtarma olabilir bir geçici çözüm var mı? Düşünebildiğim yaklaşım, redis için bir kalp atışı uygulamaktı, işlerini middleware içindeki alternatif bir veri deposuna itmek için küresel bir bayrak kurdu. Herhangi bir yardım takdir edilir. config/başlatıcıları/sidekiq.rb içindeSidekiq İstemci hata yönetimi

cevap

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 app gereksiz, ama son zamanlarda bir Raylar 5 app ihtiyaç vardı buldum.

Sidekiq.configure_client do |config| 
    config.redis = { :size => 1 } 
    config.client_middleware { |chain| chain.add SidekiqErrorHandler } unless Rails.env.test? 
end 

Bu (aynı dosyada) da kullanışlıdır:

if Rails.env.development? 
    require 'sidekiq/testing' 
    Sidekiq::Testing.inline! 
end 

Bu sidekiq işleri yerel olarak kolay hata ayıklama için izin vermek, in-line çalışmasını sağlar.