2013-04-27 21 views
11

Nie rozumiem.wiele metod na pracownika sidekiq

W dokumentacji Per Sidekiq każdy pracownik (mój nazywa się FeedWorker) może zawierać tylko jedną metodę o nazwie perform. Cóż, co jeśli chcę uruchomić wiele metod przez tego samego pracownika?

Na przykład, mój FeedWorker (zgadliście, przetwarza kanał działalności) powinien wykonać następujące 3 metody:

announce_foo 
announce_bar 
invite_to_foo 

Nie sądzę, że jest to nieuzasadnione oczekiwania. Jestem pewien, że inni to rozważyli. Nie jestem geniuszem, ale wiem, że nie odkrywam tu nowych oczekiwań. Jednak nie jest jasne, jak można to zrobić.

Teraz wygląda na to, mam do kodu w ten sposób:

def perform(id, TYPE) 
    if TYPE == BAR 
    Bar.find(id) and_announce_bar 
    else 
    Foo.find(id) and_announce_foo 
    end 
end 

nudny i brzydki kod. Tam musi być lepiej. Każda pomoc doceniona!

+0

Czy można utworzyć łącze do strony dokumentów, w której znaleziono takie oświadczenie? –

Odpowiedz

5

perform Metoda jest punktem początkowym pracownika. Wewnątrz możesz utworzyć dowolną liczbę metod instancji, aby uporządkować swój kod, najlepiej odpowiadający Twoim potrzebom. Dobrą praktyką jest jednak utrzymanie kodu roboczego tak szczupłego, jak to tylko możliwe. Na przykład wywoływanie innych obiektów z jego wnętrza jest sposobem na osiągnięcie tego. Twój kod również będzie łatwiej przetestować.

+0

Hej Fabrizio, tak naprawdę to zrobiłem. I pogodziłem się z moim losem. Dziękuję przynajmniej za kontakt! Mam nadzieję, że skorzystają na tym inni z podobnymi pytaniami. – Laurent

2

Miałem to samo pytanie na chwilę, a teraz mają dość proste rozwiązanie: Używaj Opóźniony metodę rozszerzenia na dowolnej klasy, jak wyjaśniono w docs, ex:

# Usage: EmailWorker.delay.do_something 

class EmailWorker 
    class << self 
    def send_this(attrs) 
     MyMailer.some_action(attrs).deliver 
    end 

    def send_that(attrs) 
     MyMailer.another_action(attrs).deliver 
    end 
    end 
end 

Każda klasa może być opóźniony, więc nie musisz dodawać Sidekiq :: Worker, jeśli nie zamierzasz używać metody perform_async.

Problem z tym związany polega na tym, że opcje dla poszczególnych pracowników nie będą używane, chyba że przejdziesz przez metodę perform_async.

+0

Używając '.delay' mnie jednak. Próbowałem dusić się z 'sidekiq-throttler' i nie mogłem zrozumieć, dlaczego to nie było dławienie. Miałem wiele metod w moim procesorze i wywołałem je za pomocą '.delay'. 'sidekiq-throttler' używa tych opcji na pracownika i, jak wspomniałeś, nie będą działać, dopóki nie wykonasz wywołań' perform_async'. Raz zrefactowałem mój kod, aby mieć wielu konkretnych pracowników, z których każdy miał jedną metodę "wykonywania", praca dławiła. – Jack

Powiązane problemy