【问题标题】:Sidekiq Client error handlingSidekiq 客户端错误处理
【发布时间】:2016-10-14 07:09:49
【问题描述】:

我想知道是否有办法挽救 redis 连接错误,以便我可以使用替代数据存储来推送作业。我们使用客户端中间件来设置当前线程用户等,因此拯救 .perform_async 不会有太大帮助。此外,客户端中间件似乎不支持错误处理。是否有某种解决方法可以解决客户端中间件中的 redis 连接错误?我能想到的方法是对 redis 实施心跳,设置一个全局标志以将作业推送到中间件内的替代数据存储区。任何帮助表示赞赏。

【问题讨论】:

    标签: redis sidekiq


    【解决方案1】:

    在 config/initializers/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 应用程序中是不必要的,但我最近发现在 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 作业在线运行,以便在本地轻松调试。

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2019-06-09
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多