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 。