Rails& Sidekiq:对Debounce感到困惑

时间:2016-10-18 22:17:27

标签: ruby-on-rails sidekiq debouncing

我正在构建一个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分钟窗口中执行第一个作业?

1 个答案:

答案 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没有去抖动。