【问题标题】:Sidekiq - Prevent worker from being executed in specific machineSidekiq - 防止工人在特定机器上执行
【发布时间】:2015-06-30 23:38:27
【问题描述】:

我正在开发一个使用 Sidekiq 的 Rails 项目。我们的 Sidekiq 实现有两个 worker(WorkerA,读取 queue_a,WorkerB,读取 queue_b)。其中一个必须在 Rails 应用程序所在的同一台服务器上执行,另一个必须在不同的服务器上执行。如何防止 WorkerB 在第一台服务器中执行,反之亦然?是否可以将 Sidekiq 进程配置为仅运行特定的工作人员?

编辑: Redis 服务器与 Rails 应用程序位于同一台机器上。

【问题讨论】:

    标签: ruby-on-rails distributed sidekiq


    【解决方案1】:

    使用特定于主机名的队列。配置/sidekiq.yml:

    ---
    :verbose: false
    :concurrency: 25
    :queues:
      - default
      - <%= `hostname`.strip %>
    

    在您的工作人员中:

    class ImageUploadProcessor
      include Sidekiq::Worker
      sidekiq_options queue: `hostname`.strip
    
      def perform(filename)
        # process image
      end
    end
    

    更多详情见我的博客:

    http://www.mikeperham.com/2013/11/13/advanced-sidekiq-host-specific-queues/

    【讨论】:

    • 也许我应该等待 Sidekiq 的作者回答 :) 但是,我认为 @Zoker 的方法可以,因为 queue_b 不会仅由一台主机处理。这个想法是,由于queue_b 用于长时间耗时的工作并且可以快速增长,我们希望扩大规模并创建新的工作人员来处理该队列。感谢@Mike 提供这么好的宝石
    • 不管怎样,只要你找到适合你的东西。谢谢!
    【解决方案2】:

    嗯,这是使用选项启动 sidekiq 的方法

    nohup bundle exec sidekiq -q queue_a queue_b -c 5 -e #{Rails.env} -P #{pidfile} 2>&1 &
    

    您可以使用特定的工作人员启动 sidekiq

    你可以运行nohup bundle exec sidekiq -q queue_a -c 5 -e #{Rails.env} -P #{pidfile} 2&gt;&amp;1 &amp;来只执行WorkA

    要区分不同服务器上的不同工作人员,只需执行以下操作:

    system "nohup bundle exec sidekiq -q #{workers_string} -c 5 -e #{Rails.env} -P #{pidfile} 2>&1 &"
    
    def workers_string
      if <on server A> # using ENV or serverip to distinguish
        "queue_a"
      elsif <on server B>
        "queue_b queue_b ..."
      end
    end
    
    #or you can set the workers_strings into config file on different servers
    

    【讨论】:

    • AFAIK,-q 参数是创建额外队列,而不是指定worker
    • 对不起,你可以用-q queue_a启动sidekiq,这样只会exxcute WorkA
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2021-09-08
    • 2018-07-21
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    相关资源
    最近更新 更多