2014-05-13 9 views
9

Mam dwa rodzaje zadań. Zadanie A generowane jest przez selerbeat co godzinę. Działa natychmiast i generuje tysiąc (lub wiele tysięcy) przypadków Zadania B, z których każda ma ETA jednego dnia w przyszłości.W selera, w jaki sposób mogę blokować nowsze zadania z opóźnionym opóźnieniem?

Po uruchomieniu instancja zadania A działa i generuje tysiąc Bs. I od tej pory nic się nie dzieje. Powinienem zobaczyć kolejną A biegnącą co godzinę, z kolejnym tysiącem Bs. Ale w rzeczywistości nic nie widzę.

Na zamrożeniu, rabbitmqctl pokazuje 1000 wiadomości, z 968 gotowymi i 32 niepotwierdzonymi. Godzinę później jest 1001 wiadomości, 969 gotowych i 32 niepotwierdzonych. I tak dalej, co godzinę jedna nowa wiadomość sklasyfikowana jako gotowa. Można przypuszczać, że pracownik pobiera 32 wiadomości, ale nie może ich podjąć, ponieważ ich ETA jest nadal w przyszłości. W międzyczasie nie można uruchamiać nowszych zadań, które powinny teraz działać.

Jaki jest właściwy sposób postępowania z tym? Zgaduję, że potrzebuję wielu pracowników, a może wielu kolejek (ale nie jestem pewien tego ostatniego punktu). Czy jest prostszy sposób? Próbowałem manipulować przy CELERYD_PREFETCH_MULTIPLIER i -Ofail (jak omówiono tutaj: http://celery.readthedocs.org/en/latest/userguide/optimizing.html), ale nie mogę go uruchomić. Czy moje pytanie jest takie samo jak to: [[Django Celery]] Celery blocked doing IO tasks?

W każdym razie: mogę rozwiązać ten problem tylko dlatego, że wiem wiele na temat charakteru zadań i ich czasu. Czy nie wydaje Ci się, że wystarczająca liczba zadań z przyszłą ETA może zablokować cały system? Jeśli poczekam kilka godzin, a następnie zabiję i zrestartuję robotnika, to po raz kolejny chwyta pierwsze 32 zadania i zawiesza się, mimo że w tym momencie są zadania w kolejce, które są gotowe do uruchomienia właśnie teraz. Czy jakiś komponent nie powinien być wystarczająco inteligentny, aby patrzeć na ETA i ignorować zadania, które nie są możliwe do uruchomienia?

ADDENDUM: Teraz uważam, że problem jest znanym błędem, gdy RabbitMQ 3.3 jest używany z programem Celery 3.1.0. Więcej informacji: https://groups.google.com/forum/#!searchin/celery-users/countdown|sort:date/celery-users/FiAAESOzezA/499OH-pylacJ

Po aktualizacji do Selera 3.1.1, rzeczy wydają się lepsze. Zadanie A działa co godzinę (cóż, trwa to przez kilka godzin) i planuje kopie zadania B. Wydaje się, że wypełnia on pracownika: liczba nie potwierdzonych wiadomości wciąż rośnie. Będę musiał sprawdzić, czy może rosnąć bez ograniczeń.

+1

Tak, RabbitMQ 3,3 złamał rzeczy. Miałem te same problemy, a Ask szybko wypuścił wersję 3.1.11, Kombu 3.0.13 i librabbitmq 1.5.0. –

+0

Dziękuję, straciłem cały dzień próbując dowiedzieć się, co było nie tak, dopóki nie znalazłem tego! –

+0

Rozwiązałeś to teraz? – nvartolomei

Odpowiedz

1

Wydaje się, że jest to problem, który można rozwiązać z routingiem: http://celery.readthedocs.org/en/latest/userguide/routing.html

Przy zastosowaniu routingu, można mieć wiele kolejek, które są wypełniane różnymi typami zadań. Jeśli chcesz, aby zadanie B nie blokowało więcej zadań A, możesz je utworzyć w osobnych kolejkach roboczych z innym priorytetem, tak aby twoi pracownicy pracowali w dużej kolejce pełnej zadań Bs, ale gdy dojdzie do zadania A, zostanie ono pociągnięte do następnej dostępnej pracownik.

Dodatkową korzyścią jest to, że można również przypisać więcej pracowników do mocno wypełnionych kolejek, a ci pracownicy będą pobierać tylko z wyznaczonej kolejki wysokich wolumenów.

Powiązane problemy