Rails & Sidekiq:对 Debounce 感到困惑
Rails & Sidekiq: Confused about 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 分钟内执行第一个作业 window?
像这样的问题,如果您不确定最简单的解决方法是 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 而不是去抖动。
我正在构建一个 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 分钟内执行第一个作业 window?
像这样的问题,如果您不确定最简单的解决方法是 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 而不是去抖动。