2013-07-22 6 views
13

Używam selera na rabbitmq. Wysłałem tysiące wiadomości do kolejki i są one przetwarzane pomyślnie i wszystko działa dobrze. Jednak liczba wiadomości w kilku kolejkach rabbitmq rośnie dość duża (setki tysięcy elementów w kolejce). Kolejki mają nazwę celeryev.[...] (patrz zrzut ekranu poniżej). Czy to właściwe zachowanie? Jaki jest cel tych kolejek i czy nie powinny one być regularnie usuwane? Czy istnieje sposób na ich regularne oczyszczanie, myślę, że zajmują one sporo miejsca na dysku.selera Kolejka w RabbitMQ staje się bardzo duża

screenshot of rabbitmq control

Odpowiedz

7

Można użyć opcji CELERY_EVENT_QUEUE_TTL seler (tylko pracy z AMQP), który będzie ustawić czas wygaśnięcia komunikatu, po którym zostanie usunięty z kolejki.

4

użytku Seler celeryev poprzedzone kolejki (i wymiany) dla monitoring można skonfigurować go tak, jak chcesz lub wyłączyć na wszystkich (celery control disable_events).

+0

Czy istnieje sposób na zmniejszenie lub ograniczenie pamięci zdarzeń, a nie całkowite wyłączenie? – speedplane

+0

Czy próbowałeś argumentów --maxrate i --frekwencja (lub inne?), Które mogą być umieszczone w CELERYEV_OPTS, myślę – pinepain

6

Dla każdej innej osoby, która ma problemy z kolejką celeryev, która staje się bardzo duża i zagraża przestrzeni dyskowej na serwerze rabbitmq, strzeż się akceptowanej odpowiedzi! Oto moja sugestia. Wystarczy wydać polecenie na przykład RabbitMQ:

rabbitmqctl set_policy limit_celeryev_queues "^celeryev\." '{"max-length":1000000}' --apply-to queues 

To ograniczy każdą kolejkę na literę „celeryev” do 1 mln wpisów. Zrobiłem kilka eksperymentów z zablokowaną instancją flower powodującą zbiegającą się kolejkę seereryev, a ustawienie CELERY_EVENT_QUEUE_TTL/CELERY_EVENT_QUEUE_EXPIRES nie pomogło w kontrolowaniu wielkości kolejki.

Podczas moich testów rozpocząłem proces flower, następnie SIGSTOP wykonałem i obserwowałem, jak kolejka selerowa zaczyna uciekać. Żadne z tych dwóch ustawień nie pomogło w ogóle. Potwierdziłem SIGCONT, że proces flower spowoduje szybkie przywrócenie kolejki do 0. Nie jestem pewien, dlaczego te dwa pokrętła nie pomogły, ale może to mieć coś wspólnego z tym, jak RabbitMQ implementuje te dwa ustawienia.

Po pierwsze, Per-Message TTL odpowiadający CELERY_EVENT_QUEUE_TTL ustala tylko czas wygaśnięcia dla każdej pozycji kolejki - AIUI, nie usunie automatycznie wiadomości z kolejki, aby zaoszczędzić miejsce po wygaśnięciu. Po drugie, Queue TTL odpowiadające CELERY_EVENT_QUEUE_EXPIRES mówi, że "... gwarantuje, że kolejka zostanie usunięta, jeśli nie była używana przez co najmniej okres ważności". Uważam jednak, że ich definicja "nieużywanego" może być zbyt rygorystyczna, aby można się było na nią natknąć np. przeciążony, zablokowany lub zabity proces kwiatowy.

EDIT: Niestety, jeden problem z tą sugestią jest to, że set_policy ... apply-to queues wpłynie tylko istniejących kolejki i kwiat może i będzie tworzyć nowych kolejki, które mogą przelewowy.

3

Wystarczy ustawić konfigurację dla swojego selera.

Jeśli chcesz uniknąć Seler od tworzenia celeryev.* kolejki:

CELERY_SEND_EVENTS = False # Will not create celeryev.* queues 

Jeśli potrzebujesz tych kolejek do celów monitoringu (CeleryFlower na przykład), można regularnie oczyścić je:

CELERY_EVENT_QUEUE_EXPIRES = 60 # Will delete all celeryev. queues without consumers after 1 minute. 

rozwiązanie pochodzi stąd: https://www.cloudamqp.com/docs/celery.html

Powiązane problemy