Rails 3.2.9
Ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
sidekiq 2.10.1
如果我像下面这样用自定义队列名定义一个worker
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
,我像这样调用worker:
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"}"
复述127.0.0.1:6379>
从上面可以看到,worker被分配到队列"default",我猜由于这个原因,worker无法处理。
在上述场景中,我使用以下命令启动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
此外,请注意,您可以通过使用Sidekiq::Client.push
而不是perform_async
将作业推送到您想要的队列上:
Sidekiq::Client.push({
'class' => BulkEmailWorker,
'queue' => 'bulk_mails',
'args' => [ 1, 2 ]
})
注意键(class
, queue
, args
) 必须是字符串,而不是符号,否则您将得到ArgumentError: Message must include a class and set of arguments
。
当您需要在具有变量名称(bulk_mails)的队列上推送作业时,这尤其有用。1, bulk_mails。因此,由于sidekiq-limit_fetch,您可以轻松地通过在某些队列上一次只允许一个作业来控制并发性。
您可以在sidekiq中添加队列名称和权重。Yml配置文件
:queues:
- [bulk_mails, 7]
- [default, 5]
使用-C config/sidekiq.yml
选项启动sidekiq。现在您可以在worker中引用队列名称:
sidekiq_options :queue => :bulk_mails