对 Rails 的 Sidekiq 截流以及队列

在业务中,当需要对某些场景的异步任务需要截流,以及加入队列时,该怎么做呢?

首先在Gemfile中添加以下代码:

gem 'sidekiq'
gem 'sidekiq-throttled'
gem 'sidekiq-unique-jobs'

然后 XxxWorker.rb 中引入并使用:
[Sidekiq ClassMethods](https://www.rubydoc.info/github/mperham/sidekiq/Sidekiq/Worker/ClassMethods(https://www.rubydoc.info/github/mperham/sidekiq/Sidekiq%2FWorker%2FClassMethods:sidekiq_options)

class XxxWorker
    include Sidekiq::Worker
    include Sidekiq::Throttled::Worker

    sidekiq_options retry: false, queue: :my_queue
    # 一秒限制 5 次,多的请求进入名为 my_queue 的队列等待
    sidekiq_throttle threshold: {
      limit: 5,
      period: 1.seconds,
      key_suffix: ->(user_id) { "#{user_id}_xxx" }
    }

    def perform(user_id)
      pp Time.current.strftime('%Y-%m-%d %H:%M:%S')
      ......
    end 
end

在 rails console 中,持续调用 XxxWorker n 次,即可看见 Sidekiq 日志分别为一次 5 秒

posted @ 2022-03-07 11:01  Mr-Ran  阅读(109)  评论(0编辑  收藏  举报