1 个作业是否可能被 2 个不同的 sidekiq 线程处理两次?我正在使用 sidekiq 将一些分析事件异步插入到 mongodb 集合中。我在该集合中看到大约 15 个重复项。我的猜测是 2 个工作线程同时选择了同一个作业,并将其添加到集合中。
sidekiq 是否确保作业仅由 1 个线程选择。我们可以忽略重新启动的情况,因为作业很小并且将在 8 秒内完成。
使用 sidekiq 异步触发分析事件不是一个好的做法吗?我有哪些选择?我可以向事件添加一个唯一键并在插入之前检查它以避免插入重复项,但这是添加我永远不会使用的数据(+ 开销/查询)(并且它加起来有数百万个事件)。我能以某种方式确保 sidekiq 只处理一次作业吗?
感谢您的帮助。
最佳答案
没有。 Sidekiq 使用 Redis 作为后台处理的工作队列。 Redis 提供用于将作业添加到队列和从队列中弹出作业的原子操作(特别是 redis BRPOP
command )。每个 Sidekiq worker 都尝试通过 BRPOP
从队列中获取一个超时的作业,并且从队列中弹出的任何给定作业只会返回给从队列中拉取工作的一个 worker。
更有可能的是您正在排队多个作业。
另一种可能性是您的作业抛出错误,导致它部分执行,然后被重试多次。默认情况下,Sidekiq 将重试失败的作业,但没有任何内置的事务/工作原子性机制。即:如果您的 sidekiq 作业执行 A
、B
和 C
并且执行 B
会引发异常,从而导致作业失败 - 将重试,导致每次重试作业时再次运行 A
。
关于ruby-on-rails - 2 个 sidekiq 工作线程可以处理同一个作业吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22324319/