1个作业是否有可能被2个不同的sidekiq线程处理两次?我正在使用sidekiq将一些分析事件异步插入到mongodb集合中。我看到该系列中有大约15个重复。我的猜测是,2个工作线程同时选择了相同的工作,并添加到集合中。
sidekiq是否确保仅通过1个线程挑选作业。我们可以忽略重启情况,因为这些工作很小,并且会在不到8秒的时间内完成。
使用sidekiq异步触发分析事件不是一个好习惯吗?我有什么选择?我可以为事件添加一个唯一的密钥,并在插入之前检查它以避免插入重复项,但是它会添加我永远不会使用的数据(+开销/查询)(并且它会增加数百万事件)。我可以以某种方式确保作业仅由sidekiq处理一次吗?
感谢您的帮助。
答案 0 :(得分:11)
没有。 Sidekiq使用Redis作为后台处理的工作队列。 Redis提供原子操作,用于向队列添加作业并从队列中弹出作业(特别是redis BRPOP
command)。每个Sidekiq工作程序都尝试通过BRPOP
从队列中获取作业,并且从队列中弹出的任何给定作业将只返回给从队列中拉出工作的一个工作人员。
更有可能的是,你正在招聘多个职位。
另一种可能性是您的作业抛出错误,导致其部分执行,然后重新尝试多次。默认情况下,Sidekiq将重试失败的作业,但没有任何内置的工作事务/原子性机制。 ie:如果你的sidekiq作业有A
,B
和C
,并且B
会引发异常,导致作业失败 - 它将被重试,导致{{每次重试作业时都要再次运行。