2016-08-04 46 views
1

Lassen Sie sich sagen, dass ich einen Arbeiter mit einigen params haben: Ich reduzierte Anzahl von Arbeitern argsWie werden bereits eingereihte Jobs behandelt, nachdem die Anzahl der Argumente in verwandten Worker reduziert wurde?

class Foo 
    include Sidekiq::Worker 
    sidekiq_options queue: :critical 

    def perform(param1, param2, param3) 
    ... 
    end 
end 

Es seit einiger Zeit gearbeitet und dann:

class Foo 
    include Sidekiq::Worker 
    sidekiq_options queue: :critical 

    def perform(param1, param2) 
    ... 
    end 
end 

Aber es gibt einige Arbeitsplätze mit früheren Anzahl von Argumenten in der Warteschlange noch. Wie kann man solche Situationen am besten bewältigen?

Antwort

1

Tun Sie dies:

def perform(param1, param2, _=nil) 

Der Unterstrich ist eine Konvention Bedeutung „dieses Argument nicht verwendet wird und ignoriert "und der Null-Standard bedeutet, dass die Funktion mit 2 oder 3 Argumenten arbeitet.

Sobald die Warteschlange von alten Jobs gelöscht wurde, können Sie den dritten Arg vollständig entfernen.

1

Entweder müssen Sie die Warteschlange entleeren (und verhindern, dass andere Aufträge in die Warteschlange eingereiht werden), oder Sie müssen diese Aufträge abbrechen/löschen.

Sie können diese Jobs abbrechen, aber der Autor von Sidekiq empfiehlt dagegen. Der sidekiq wiki erklärt es als:

Sidekiq bietet diese Funktionalität nicht; es ist sicherer und besser für die Anwendung, es zu tun. Sie sollte wie folgt implementieren:

class MyWorker 
    include Sidekiq::Worker 

    def perform(args) 
    return if cancelled? 
    # do stuff 
    end 

    def cancelled? 
    Sidekiq.redis {|c| c.exists("cancelled-#{jid}") } 
    end 

    def self.cancel!(jid) 
    Sidekiq.redis {|c| c.setex("cancelled-#{jid}", 86400, 1) } 
    end 
end 

Die sicherste Wette wahrscheinlich Option ist 1.