对 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 秒