如何使用Sidekiq将工作推送到特定队列并限制工作者数量?

7
我知道我们可以做到以下几点:

sidekiq_options queue: "Foo"

但在这种情况下,Worker只被分配到一个队列:"Foo"。
我需要为特定的队列分配作业(而不是Worker)。 使用Resque很容易:
Resque.enqueue_to(queue_name, my_job)

此外,针对并发问题,我需要限制每个队列上Worker的数量为1。

我该怎么做?

2个回答

6
您可以使用 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。


是的,这是一件好事,但我需要动态队列名称,如果我必须在文件中定义它们,那就不是一个好的解决方案。例如:如果我有游戏,工作属于一个游戏。我想创建动态队列名称,如“game_”+ game_id,并将工作推入一个良好的队列。你明白吗?我该怎么做呢? - Matrix
我也问了同样的问题 :) https://dev59.com/u3nZa4cB1Zd3GeqPp212 - Maxime
是的,我知道这点,但是 sidekiq-limit-fetch 和 sidekiq-dynamic-queues 是不兼容的插件!我需要它们两个,但我不能同时使用 :'( 有什么想法吗? - Matrix

1
我已经使用Sidekiq限制获取功能实现了上述功能。您可以将动态队列模式设置为True,并在Sidekiq :: Client.push中指定队列。
并将进程限制设置为特定队列。我们可以设置进程限制,或者忽略并按照Sidekiq默认限制进行处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接