2016-10-19 1 views
2

Ich verwende Sidekiq debounce, um die Anzahl der Jobs in einem Zeitrahmen Rate zu begrenzen. Hier ist mein Job:Rails: Wie Sidekiq :: Debounce zu meiner Middleware-Kette hinzufügen

class CalculateAllEventRankingsForUser 
    include Sidekiq::Worker 
    sidekiq_options debounce: true 

    def perform(user_id) 
    puts "recalculating all events for user" 
    ## do some work 
    end 

end 

Wo ich den Job nennen:

CalculateAllEventRankingsForUser.perform_in(20.seconds, self.id) 

Und mein sidekiq initializer:

Sidekiq.configure_server do |config| 
    config.client_middleware do |chain| 
    chain.add Sidekiq::Debounce 
    end 
    config.server_middleware do |chain| 
    chain.add Sidekiq::Debounce 
    end 
end 

Das Problem ist, dass alle meine sidekiq Arbeitsplätze noch verarbeitet werden, sogar wenn ich innerhalb des Zeitfensters von 20 Sekunden feuere. Meine Absicht ist, dass nur ein Job alle 20 Sekunden (maximal) ausgelöst wird.

Aus der Dokumentation:

hinzufügen Sidekiq :: Debounce auf Ihre Client-Middleware-Kette, und dann sidekiq_options debounce hinzufügen: getreu dem Arbeiter Sie Entprellen wollen.

Verwenden Sie #perform_in anstelle von #perform_async, um den Zeitrahmen festzulegen.

Hauptsache ich bin mir nicht sicher, wie Sidekiq :: Debounce zu meiner Middleware-Kette hinzuzufügen. Ich bin mir nicht sicher, ob ich das richtig mache.

Irgendwelche Ideen zur Lösung?

+0

Sie halten gleiche Frage statt Lesen vorherige Antwort auf Ihre vorherige Frage: http://stackoverflow.com/questions/40119004/rails-sidekiq-confused-about-debounce/40119327? Noredirect = 1 # comment67509958_40119327 –

+0

Hey @SergeyMoiseev. Ich habe Ihre Lösung aus der vorherigen Antwort implementiert. Dies ist eine andere Frage mit spezifischeren Details. Ich habe meinen Code neu geschrieben, so dass Debounce die ideale Lösung ist. Aber ich bin nicht sicher, wie Sidekiq :: Debounce zu meiner Middleware-Kette hinzugefügt werden soll. Im Moment versuche ich sidekiq-debounce zu implementieren, aber alle meine Jobs feuern immer noch. –

+0

Welche Version von Siqekiq verwenden Sie? –

Antwort

0

sidekiq-debounce arbeitet mit sidekiq 4.2. Der Grund, warum dies nicht der Fall war, ist wahrscheinlich auf die Art und Weise zurückzuführen, in der Client-Middleware in dem von Ihnen freigegebenen Code konfiguriert wurde.

Dies sollte funktionieren:

Sidekiq.configure_server do |config| 
    config.server_middleware do |chain| 
    chain.add Sidekiq::Debounce 
    end 
end 

Sidekiq.configure_client do |config| 
    config.client_middleware do |chain| 
    chain.add Sidekiq::Debounce 
    end 
end 
Verwandte Themen