我正在构建一个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
我对宝石的作用感到困惑。它是在5分钟内自动将所有作业作为一个作业执行还是仅在每个5分钟窗口中执行第一个作业?
答案 0 :(得分:1)
如果您不确定最简单的方法是look into gem code,那么就像这样的问题一样:
# 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没有去抖动。