我有一个用例,希望在将来发生用户事件时清除一些sidekiq作业。
一种方法是将作业id存储在某个地方(比如redis),然后使用它搜索和删除作业。

 Sidekiq::ScheduledSet.new.find_job([job_id]).delete

但我必须将它存储在redis中,并在队列中的所有作业之间进行线性搜索。
另一种方法是在worker中添加一个额外的参数。然后用它搜索并删除。
Sidekiq::ScheduledSet.new.find {|j| j.queue == 'my_queue' && j.args[0] == "my_tag_user_id"}.map(&:delete)

这样,至少我不必担心在redis中存储作业id。但我不认为这会让搜索变得更快,而且看起来有点像一个老套的解决方案。
我需要一些建议,什么是最好的方式来标记sidekiq中给定用户的一些作业,然后快速搜索它们以便删除。

最佳答案

sidekiq的内部数据结构没有针对这种类型的操作进行优化。相反,为与用户关联的作业创建事务id并将其存储在数据库中。

tid = SecureRandom.hex(16)
user.update_column(:tid, tid)
10.times { SomeWorker.perform_async(user.id) }

当未来事件发生时,在redis中设置一个标志,该标志表示与此事务id关联的所有作业都应取消。
Sidekiq.redis {|c| c.setex(user.tid, 2.weeks, 1) }

当作业运行时,它们应该做的第一件事是检查它们是否已被取消。如果是的话,他们什么也不做就马上回来。
def perform(user_id)
  user = User.find(user_id)
  return if cancelled?(user.tid)
  do_stuff
end

关于ruby-on-rails - 在sidekiq中标记作业以便将来快速搜索和删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42556146/

10-12 12:48
查看更多