2013-01-17 9 views
7

Używamy aplikacji RQ z naszą aplikacją WSGI. To, co robimy, ma kilka różnych procesów na różnych serwerach zaplecza, które wykonują zadania, łącząc się z (prawdopodobnie) kilkoma różnymi serwerami zadań. Aby lepiej skonfigurować tę konfigurację, używamy niestandardowej warstwy zarządzania w naszym systemie, która zajmuje się uruchamianiem pracowników, ustawianiem kolejek zadań itp.Ponowna próba nieudanych prac w RQ

Gdy zadanie się nie powiedzie, chcielibyśmy zaimplementować ponowną próbę, która ponawia próbę zadanie kilka razy po rosnącym opóźnieniu, a ostatecznie albo je ukończyć albo go zawieść, a następnie zaloguj się do naszego systemu rejestrowania błędów. Jednak nie jestem pewien, jak to powinno zostać wdrożone. Już utworzony niestandardowy skrypt pracownika, który pozwala nam na log błędu do naszej bazy danych, a moja pierwsza próba ponownego było coś na wzór tego:

# This handler would ideally wait some time, then requeue the job. 
def worker_retry_handler(job, exc_type, exc_value, tb): 
    print 'Doing retry handler.' 
    current_retry = job.meta[attr.retry] or 2 

    if current_retry >= 129600: 
     log_error_message('Job catastrophic failure.', ...) 
    else: 
     current_retry *= 2 

     log_retry_notification(current_retry) 
     job.meta[attr.retry] = current_retry 
     job.save() 
     time.sleep(current_retry) 

     job.perform() 

return False 

Jak już wspomniałem, mamy także funkcji w plik roboczy, który poprawnie rozpoznaje serwer, z którym powinien się połączyć i może publikować zadania. Problem niekoniecznie polega na tym, że aby opublikować zadanie, należy wykonać , ale należy wykonaćz instancją zadania, która znajduje się w procedurze obsługi wyjątku.

Każda pomoc zostanie bardzo doceniona. Jeśli istnieją sugestie lub wskazówki na temat lepszych sposobów, aby to zrobić, byłoby również świetne. Dzięki!

+0

Przykro mi, nie znam się na RQ - czy możesz podać link do biblioteki? – necaris

+0

Zgaduję, że masz na myśli http://python-rq.org/ prawda? – Borys

Odpowiedz

1

widzę dwa możliwe problemy:

  1. trzeba mieć wartości zwracanej. False zapobiega domyślnej obsłudze wyjątków od zadania (zobacz ostatnią sekcję na tej stronie: http://python-rq.org/docs/exceptions/). Nie jestem w 100% pozytywny (szczególnie biorąc pod uwagę dokumenty, które wskazałem powyżej), ale jeśli znajduje się on w nieudanej kolejce, możesz wywołać polecenie receue_job (job.id), aby spróbować ponownie. Jeśli nie jest (co brzmi jak nie będzie), prawdopodobnie mógłbyś pobrać odpowiednią kolejkę i umieścić ją bezpośrednio.

Powiązane problemy