2016-10-18 31 views
0

我在构建一个Tinder风格的应用程序,用户可以通过事件轻扫。Rails&Sidekiq:对Debounce感到困惑

目前,我有一个后台作业,在用户滑动事件时被触发。随着用户通过刷卡每分钟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

在这样一个问题,和往常一样,如果你不知道要弄清楚简单的方法是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不debounce。

+0

基本上我的目标是减少后台作业的数量。假设我目前有5分钟的每分钟运行1项工作。如果不剔除,它将运行5个工作(每60秒)。 *随着* debounce,它也会运行5个工作(每5分钟)?或者它会运行1份工作(每5分钟将5份工作合并为1份)? –

+0

看看这段代码。在定义的条件下,将有0个作业正在运行。因为每次通话都会在5分钟后重新安排时间。所以它只会在下一次电话会在+5.01发生时第一次运行。 –