Sidekiq独特任务处理

3

我需要确保任何25个工人中的任何一个人同时只能处理一个特定用户ID的作业,以避免死锁。

我尝试过Sidekiq的唯一任务,但由于它继续尝试处理队列中所有未完成的作业而没有查找参数中的user_id,导致死锁不断发生。

谢谢

class MyWork   
  include Sidekiq::Worker   
  sidekiq_options :queue => "critical", unique: true,
                   unique_args: ->(args) { [ args.user_id ] }


  def perform(work_params)

这里有一个不太好的想法:你可以维护一个包含正在处理的用户ID的表。每次开始处理时,查看表和当前用户ID;仅当用户ID不在表中时才开始处理。如果它在表中,则将作业推回队列。 - bsvin33t
最终,这可能不是一个坏主意 :) - ace
你应该尝试使用Redis提供的内存存储来完成这个任务,而不是使用ActiveRecord。 - bsvin33t
我将调查并可能尝试使用Redis内存存储,如果它可以节省资源并提供更快的数据访问速度的话。从未听说过这个 @Vineeth。 - ace
1个回答

4

sidekiq_option的args是一个数组,它的第一个位置有你的works_params。你需要这样做:

class MyWork
  include Sidekiq::Worker
  sidekiq_options :queue => "critical", unique: until_executed, 
                   unique_args: ->(args) { [ args.first.user_id ] }

  def perform(work_params)

请注意,unique: true已废弃,因此您应该使用unique: until_executed或最适合您的worker的其他选项。请参见此处获取其他选项。

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