【问题标题】:Sidekiq Unique Job ProcessingSidekiq 独特的作业处理
【发布时间】:2015-05-27 14:10:12
【问题描述】:

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

我已经尝试过 sidekiq 独特的作业,但死锁不断发生,因为它一直在尝试处理队列中所有待处理的作业,而不是在参数上查找 user_id。

谢谢

类我的工作
包括 Sidekiq::Worker
sidekiq_options:队列=> “关键的”,独特的:真实的, unique_args: ->(args) { [ args.user_id ] }

定义执行(工作参数)

【问题讨论】:

  • 这是一个不太好的主意:您可以维护一个包含正在处理的用户 ID 的表。每次要开始处理的时候,看看表和当前的用户id;仅当用户 ID 不在表中时才开始处理。如果它在表中,则将作业推回队列。
  • 最终这可能是一个不错的主意:)
  • 你应该尝试使用redis提供的内存存储来做到这一点,而不是activerecord。
  • 如果我可以节省资源并更快地提供数据,我将调查并可能尝试使用 redis 内存存储,从未听说过 @Vineeth。

标签: ruby-on-rails-4 redis capistrano resque sidekiq


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2014-08-07
    • 2018-09-27
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多