使用“自定义”队列名称的Sidekiq worker被分配到“default”队列

时间:2013-04-24 14:24:04

标签: ruby-on-rails-3.2 queue sidekiq

Rails 3.2.9
Ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
sidekiq  2.10.1

如果我使用自定义队列名称定义下面的工作人员

  class BulkEmailWorker
    include Sidekiq::Worker
    # https://github.com/mperham/sidekiq/wiki/Advanced-Options
    sidekiq_options(queue: :bulk_mails, backtrace: true)

    # https://github.com/mperham/sidekiq/wiki/Best-Practices
    # Section: Make your jobs small and simple
    def perform
      # https://github.com/mperham/sidekiq/wiki/Delayed-Extensions
      scheduled_mails = MailTemplate.with_schedule
      scheduled_mails.each do |mail_template|
        BulkMailer.delay.general_mail(mail_template.id)
      end
    end
  end

我按照这样调用工人:

  BulkEmailWorker.perform_async

它不起作用(换句话说,不发送电子邮件)。

检查redis中的数据我发现如下:

  redis 127.0.0.1:6379> keys *
  1) "myapp:stat:processed:2013-04-24"
  2) "myapp:queue:default"
  3) "myapp:stat:processed"
  4) "myapp:queues"

  redis 127.0.0.1:6379> lrange myapp:queue:default -100 100

   1) "{\"retry\":true,\"queue\":\"default\",\"timeout\":30,\"class\":\"Sidekiq::Extensions::DelayedMailer\",\"args\":[\"---\\n- !ruby/class 'BulkMailer'\\n- :general_mail\\n- - 1\\n\"],\"jid\":\"e46693944febf7ae26ec67a0\"}"

redis 127.0.0.1:6379>

从上面可以看出,工作人员被分配到队列“默认”,我想由于这个原因,工人无法处理。

我在上面的场景中使用以下命令启动了sidekiq:

  bundle exec sidekiq -e dev_mysql -C config/sidekiq.yml -q bulk_mails

然而,当我从我的工作人员中删除

    sidekiq_options(queue: :bulk_mails, backtrace: true)

并使用以下命令启动sidekiq:

  bundle exec sidekiq -e dev_mysql -C config/sidekiq.yml

它有效(换句话说,它成功发送电子邮件)。

/config/sidekiq.yml

# https://github.com/mperham/sidekiq/wiki/Logging
# http://stackoverflow.com/questions/15260634/sidekiq-configuration-for-multiple-environments
---
  :verbose: true
  :pidfile: ./tmp/pids/sidekiq.pid
  :logfile: ./log/sidekiq.log
  :concurrency:  25

我刚开始使用Sidekiq并且是新手。如果我有一些我误解或不知道的概念,请跟我说。

我需要摆脱上述问题,以便将我的工作人员分配到所需的队列并成功处理。

谢谢, Jignesh

2 个答案:

答案 0 :(得分:16)

此外,请注意您可以使用Sidekiq::Client.push代替perform_async在所需队列中推送作业:

Sidekiq::Client.push({
  'class' => BulkEmailWorker,
  'queue' => 'bulk_mails',
  'args'  => [ 1, 2 ]
})

请注意,密钥(classqueueargs必须为字符串,而不是符号,否则您将获得ArgumentError: Message must include a class and set of arguments

当您需要在具有变量名称的队列(bulk_mails.1,bulk_mails.2等)上推送作业时,这尤其有用,因此您只需允许控制并发性即可感谢sidekiq-limit_fetch,在某些队列上一次完成一份工作。

答案 1 :(得分:6)

您可以在sidekiq.yml配置文件中添加队列名称和权重:

:queues:
- [bulk_mails, 7]
- [default, 5]

使用-C config/sidekiq.yml选项启动sidekiq。现在,您可以在工作人员中引用队列名称:

sidekiq_options :queue => :bulk_mails