Rails和Sidekiq:对Debounce感到困惑

我正在构建一个Tinder风格的应用程序,用户可以在其中轻扫事件。

目前,我有一个后台工作,每当用户刷一个事件时都会被触发。 当用户每分钟刷过20个事件时,我正在创建大量的后台工作:

worker.rb

class Worker include Sidekiq::Worker def perform(user_id, newly_voted_event_id) user = User.find(user_id) event = Event.find(newly_voted_event_id) events_to_rerank = event.similar.unvoted(user_id) events_to_rerank.each do |e| e.rank(user_id) end end end 

User.rb:

 def recalculate_similar_events(event_id) CalculateRelevantEventRankingsForUser.perform_async(self.id, event_id) end 

我想做的是每个用户每5分钟最多运行一个后台作业。 所以我将使用sidekiq-debounce将我的后台工作改为:

 def recalculate_similar_events(event_id) CalculateRelevantEventRankingsForUser.perform_in(5.minutes, self.id, event_id) end 

我对gem的作用感到困惑。 它是在5分钟内自动将所有作业作为一个作业执行还是仅在每个5分钟窗口中执行第一个作业?

像往常一样,如果你不确定最简单的方法是查看gem代码 :

  # Reschedule the old job to when this new job is scheduled for # Or yield if there isn't one scheduled yet jid = scheduled_jid ? reschedule(scheduled_jid, @msg['at']) : yield 

因此,如果您在另一次运行时已经有一份工作,那么它将被重新安排到5分钟后。

更新:从评论看起来你正在寻找sidekiq-rate-limiter而不是debounce 。