2012-04-09 26 views
5

Mam dwa oddzielne procesy selerowe działające na moim serwerze, zarządzane przez supervisor. Mieszczą się one do słuchania na osobnych kolejek jako takie:Trasa zadania selera do określonej kolejki

[program:celeryd1] 
command=/path/to/celeryd --pool=solo --queues=queue1 
... 

[program:celeryd2] 
command=/path/to/celeryd --pool=solo --queues=queue2 
... 

A moja celeryconfig wygląda mniej więcej tak:

from celery.schedules import crontab 

BROKER_URL = "amqp://guest:[email protected]:5672//" 

CELERY_DISABLE_RATE_LIMITS = True 
CELERYD_CONCURRENCY = 1 
CELERY_IGNORE_RESULT = True 

CELERY_DEFAULT_QUEUE = 'default' 
CELERY_QUEUES = { 
    'default': { 
     "exchange": "default", 
     "binding_key": "default", 
    }, 
    'queue1': { 
     'exchange': 'queue1', 
     'routing_key': 'queue1', 
    }, 
    'queue2': { 
     'exchange': 'queue2', 
     'routing_key': 'queue2', 
    }, 
} 

CELERY_IMPORTS = ('tasks',) 

CELERYBEAT_SCHEDULE = { 
    'first-queue': { 
     'task': 'tasks.sync', 
     'schedule': crontab(hour=02, minute=00), 
     'kwargs': {'client': 'client_1'}, 
     'options': {'queue': 'queue1'}, 
    }, 
    'second-queue': { 
     'task': 'tasks.sync', 
     'schedule': crontab(hour=02, minute=00), 
     'kwargs': {'client': 'client_2'}, 
     'options': {'queue': 'queue1'}, 
    }, 
} 

Wszystkie zadania tasks.sync musi być kierowany do konkretnej kolejki (i dlatego celeryd toku). Ale kiedy próbuję uruchomić zadanie ręcznie z sync.apply_async(kwargs={'client': 'value'}, queue='queue1'), obydwaj pracownicy selerowi podejmują się zadania. Jak ustawić trasę zadania w poprawnej kolejce i uruchomić ją tylko pracownik powiązany z kolejką?

Odpowiedz

6

Masz tylko jedną instancję selekcji, prawda?

Może masz stare powiązania w kolejce, które kolidują z tym? Spróbuj uruchomić rabbitmqctl list_queues i rabbitmqctl list_bindings, może zresetować dane w brokerze, aby rozpocząć od zera.

Przykład, który tu masz, powinien zadziałać i działa dla mnie, gdy tylko go wypróbowałem.

Wskazówka: Ponieważ używasz tej samej wartości wymiany i powiązania jako nazwy kolejki, , nie musisz jawnie wymieniać ich w CELERY_QUEUES. Gdy CELERY_CREATE_MISSING_QUEUES jest włączony (domyślnie), kolejki będą automatycznie tworzone dokładnie tak, jak masz , jeśli wykonasz tylko celeryd -Q queue1 lub wysłałeś zadanie do kolejki, która jest niezdefiniowana.

Powiązane problemy