2016-10-18 3 views
0

Я создаю приложение стиля Tinder, где пользователи могут прокручивать события.Rails & Sidekiq: Confused about 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 минут позже.

Update: Как видно из комментариев, которые ищут sidekiq-rate-limiter не дребезг.

+0

В основном моя цель - сократить количество фоновых заданий. Допустим, у меня в настоящее время 1 работа, работающая каждую минуту в течение 5 минут. Без отладки он будет запускать 5 заданий (каждые 60 секунд). * С * debouncing, будет ли он также запускать 5 заданий (каждые 5 минут)? Или он будет запускать 1 работу (каждые 5 минут, объединяя 5 заданий в 1)? –

+0

Посмотрите на этот код. При определенных условиях будет выполняться 0 заданий. Потому что при каждом вызове он будет перенесен на +5 минут. Таким образом, он будет запускаться в первый раз только тогда, когда следующий вызов произойдет на +5.01. –