Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 Sidekiq唯一作业处理_Ruby On Rails 4_Redis_Capistrano_Resque_Sidekiq - Fatal编程技术网

Ruby on rails 4 Sidekiq唯一作业处理

Ruby on rails 4 Sidekiq唯一作业处理,ruby-on-rails-4,redis,capistrano,resque,sidekiq,Ruby On Rails 4,Redis,Capistrano,Resque,Sidekiq,我需要确保25名员工中的任何一人同时处理的每个用户id不超过一个作业,以避免死锁 我尝试过sidekiq unique作业,但死锁不断出现,因为它一直试图处理队列中所有挂起的作业,而不在参数上查找用户id 多谢各位 班级作业 包括Sidekiq::Worker sidekiq_选项:队列=> “关键”,独特:真实, 唯一的参数:->(参数){[args.user\u id]} def执行(工作参数) sidekiq_选项args是一个数组,它的参数在第一个位置工作。然后你应该做: class M

我需要确保25名员工中的任何一人同时处理的每个用户id不超过一个作业,以避免死锁

我尝试过sidekiq unique作业,但死锁不断出现,因为它一直试图处理队列中所有挂起的作业,而不在参数上查找用户id

多谢各位

班级作业
包括Sidekiq::Worker
sidekiq_选项:队列=> “关键”,独特:真实, 唯一的参数:->(参数){[args.user\u id]}

def执行(工作参数)


sidekiq_选项
args
是一个数组,它的
参数在第一个位置工作。然后你应该做:

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_execute
或任何最适合您的工作人员的方法。有关其他选项,请参阅。

这里有一个不太好的主意:您可以维护一个包含正在处理的用户ID的表。每次必须开始处理时,请查看表和当前用户id;仅当用户id不在表中时才开始处理。如果作业在表中,请将其推回到队列。最终,这可能不是一个坏主意:)您应该尝试使用redis提供的内存存储来完成此操作,而不是使用activerecord。如果iy节省资源并更快地提供数据,我将调查并可能尝试使用redis内存存储@Vineth。