如何在特定队列中推送工作并使用sidekiq限制数字工作者?

时间:2013-11-19 19:11:31

标签: ruby resque jobs sidekiq worker

我知道我们可以做到:

sidekiq_options queue: "Foo"

但在这种情况下,它是仅分配给一个队列的Worker:“Foo”。

我需要在特定队列中分配一个Job(而不是Worker)。 使用Resque很容易:

Resque.enqueue_to(queue_name, my_job)

此外,对于并发问题,我需要将每个队列上的Worker数限制为1.

我该怎么做?

3 个答案:

答案 0 :(得分:4)

您可以使用https://github.com/brainopia/sidekiq-limit_fetch

然后:

Sidekiq::Client.push({
    'class' => GuidePdfWorker,
    'queue' => queue_name,
    'args'  => [my_job]
})
Sidekiq::Queue[queue_name].limit = 1

但是你必须在config / sidekiq.yml

中声明你的queue_name

答案 1 :(得分:1)

我做了fork gem并修改为使用动态队列,做了pull请求但是我正在等待merge。但在我的业务中,我使用我的宝石,如下所示。

https://github.com/dlanileonardo/sidekiq-limit_fetch

只将我的宝石放在Gemfile中:

gem 'sidekiq-limit_fetch', :git => 'https://github.com/dlanileonardo/sidekiq-limit_fetch.git'

(抱歉,我不会说英语)

如果我的拉取请求状态为Merged,则更新原始gem,将传递单元测试。

https://github.com/brainopia/sidekiq-limit_fetch/pull/46

答案 2 :(得分:1)

我使用sidekiq limit fetch实现了上述功能。您可以将Sidekiq::Client.push设置为true,并在process limit

中指定队列

并将attributes: { createdAt: { type: 'datetime', columnName: 'cre_dt' }, updatedAt: { type: 'datetime', columnName: 'upd_dt' }, // your other columns } 设置为特定队列。我们可以设置流程限制,也可以忽略,只需按照sidekiq默认限制进行处理