2016-10-18 50 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發生時第一次運行。 –