2015-12-14 14 views
7

Przeczytałem wiele (wspaniałych) artykułów na temat integracji RabbitMQ w aplikacji Symfony.Symfony: czy powinienem dodać komendę rabbitmq: consumer do crontaba?

RabbitMqBundle sprawia, że ​​bardzo łatwo go niewdzięczny i zapewnia wygodny polecenie rabbitmq:consumer konsumować wiadomości z kolejki tak:

app/console rabbitmq:consumer -m 50 upload_picture 

Mam pytanie jednak. Czy polecacie dodać to polecenie do crontaba? Czy są na to jakieś najlepsze praktyki?

+1

Notatka boczna -m 50 nie jest niezawodna przez cały czas. Na przykład, jeśli masz kilka metod, które od czasu do czasu pojawiają się w kolejce, będziesz mieć problemy z utraconymi połączeniami. Dzieje się tak z powodu długiego okresu bezczynności. Lepiej ograniczyć rzeczywisty czas działania polecenia. Limit czasu połączenia może być związany z tym limitem. Konsument pracuje przez 1 godzinę i wychodzi, aby czas oczekiwania mógł wynosić 1 godzinę i 20 minut. To jest coś, czego brakuje pakietowi rabbitmq, ale jest on dostępny w pakiecie enqueue (--limit-time = "teraz + 1 godzina"). –

Odpowiedz

6

Bardziej akceptowaną metodą jest utrzymanie konsumenta w ruchu. Są narzędzia takie jak Supervisor i Circus, które mogą ci w tym pomóc. Zobacz this discussion. Ale jeśli możesz zmusić konsumenta do wyjścia, gdy nie ma już żadnych wiadomości, możesz również użyć crona. Chociaż może to spowodować opóźnienie w korzystaniu z wiadomości. Nie można natychmiast reagować na wiadomości. Użytkownicy mogą poczekać minutę, zanim jakiekolwiek zadanie zostanie uruchomione/poczta zostanie odebrana.

Proszę wziąć pod uwagę następujące czynniki przy prowadzeniu Konsumentów (lub dowolny kod PHP dla tej sprawy) przez długi czas:

Staraj się unikać Wykorzystanie pamięci akumulacji. Nie dołączaj do tablic bez ich usuwania. Oznacza to na przykład, że nie powinieneś używać FingersCrossedHandler w Monologu, ponieważ zachowuje to bufor wiadomości dziennika. W porządku dla pojedynczego żądania, a nie dla dni z wiadomościami debugowania.

Nawet jeśli zachowasz ostrożność, PHP może spowodować nieszczelność pamięci. Co możesz powiedzieć, PHP ... (To może być naprawdę chwytliwe hasło) W mojej sytuacji mam zainstalowany cronjob, który co wieczór uruchamia pracowników, ale teoretycznie konsumenci mogą działać około miesiąca, zanim zabraknie im pamięci.

+5

Dziękuję za odpowiedź. Właśnie tego szukałem, ponieważ nigdy nie było wspomniane w poradnikach RabbitMQ for Symfony. Wygląda na to, że istnieje interesujący pakiet Symfony do obsługi automatycznej konfiguracji Supervisord dla RabbitMQBundle: https://github.com/Phobetor/rabbitmq-supervisor-bundle –

+1

Link do problemu pod "tą dyskusją" jest wyłączony. – Cassiano

+1

Unikałbym wspomnianego pakietu w pierwszym komentarzu. –

Powiązane problemy