gpt4 book ai didi

ruby-on-rails - 如何配置sidekiq队列一次只运行任务

转载 作者:行者123 更新时间:2023-12-05 01:41:01 26 4
gpt4 key购买 nike

我在我的 Rails 应用程序中使用 Sidekiq 来处理后台作业。

sidekiq.yml

:verbose: false
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency: 5
:queues:
- ["queue1", 1]
- ["queue2", 1]
- ["queue3", 1]
- ["queue4", 1]
- ["queue5", 1]
- critical
- default
- low
max_retries: 1

我想一次只为每个队列运行一个任务。

例如:我在 queue1 中启动同一个 worker 3 次,我想处理 worker1,然后是 worker2,然后是 worker3。

我在 sidekiq.yml 中添加了带有队列名称的“1”(例如 ["queue1", 1])。我认为这个配置只会在 queue1 中运行一个 worker。但这并没有发生。

如何在sidekiq中实现上述配置?

最佳答案

首先对术语进行了轻微修正。 “ worker ”不断运行线程,消耗“队列”中的“工作”。因此,您不处理 worker1,worker1 将处理来自 queue1 的作业。

现在进入解决方案:-

您的用例似乎是您不希望特定类型的作业(在您的案例中上传到 s3 的作业)在给定时刻在多个工作人员上执行。

为此,您需要在作业级别使用锁定机制。 Sidekiq 本身不提供锁定,因此您需要为此使用外部 gem。

我已经使用基于 redis 的“sidekiq-lock”在我的项目中实现了类似的功能。

Gem Link

用法如下:-

class Worker
include Sidekiq::Worker
include Sidekiq::Lock::Worker

# static lock that expires after one second
sidekiq_options lock: { timeout: 1000, name: 'unique-lock-name' }

def perform
# your code to upload to s3
end
end

这将确保您的代码一次仅在一名工作人员上运行给定作业的一个实例。

关于ruby-on-rails - 如何配置sidekiq队列一次只运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55280479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com