ruby-on-rails-4 - Sidekiq 独特的作业处理

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

我需要确保 25 个工作人员中的任何一个同时处理每个 user_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)

最佳答案

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其他选项。

关于ruby-on-rails-4 - Sidekiq 独特的作业处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29229687/

相关文章:

ruby-on-rails - Errno::ENOENT:没有这样的文件或目录 - connect(2) for home/ubuntu/GlucoMeDDC/shared/tmp/sockets/puma.sock

ruby-on-rails - 如何添加具有额外列的多对多记录

ruby-on-rails - 更改 Rails 4 中的默认日期和时间格式

ruby-on-rails - 503 服务不可用但 heroku 日志显示 200

python - Django + CELERY_TASK_ROUTES 不适用于模块相对路径和通配符

amazon-web-services - CloudFormation 中的 Redis 多可用区功能

git - capistrano ssh 代理转发 - 权限被拒绝(公钥)

ruby-on-rails - 为什么我的 Rails API 没有将任何内容保存到数据库中?

php - 在 Laravel 中使用 redis 作为队列驱动程序的作业失败表

Capistrano - 如何将文件放入共享文件夹?