2012-04-09 14 views
5

Tôi có hai quy trình celeryd riêng biệt chạy trên máy chủ của mình, được quản lý bởi supervisor. Chúng được thiết lập để lắng nghe trên hàng đợi riêng biệt như vậy:Hành trình cần tây để xếp hàng cụ thể

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

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

Và celeryconfig của tôi trông giống như sau:

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'}, 
    }, 
} 

Tất cả tasks.sync nhiệm vụ phải được chuyển đến một hàng đợi cụ thể (và tiến bộ do đó celeryd). Nhưng khi tôi cố gắng thực hiện nhiệm vụ một cách thủ công với sync.apply_async(kwargs={'client': 'value'}, queue='queue1') cả nhân viên cần tây đều nhận nhiệm vụ. Làm thế nào tôi có thể làm cho các tuyến đường công việc đến hàng đợi chính xác và chỉ được chạy bởi các công nhân bị ràng buộc vào hàng đợi?

Trả lời

6

Bạn chỉ đang chạy một cá thể cần thiết phải không?

Có thể bạn có các ràng buộc hàng đợi cũ xung đột với điều này? Thử chạy rabbitmqctl list_queuesrabbitmqctl list_bindings, có thể đặt lại dữ liệu trong nhà môi giới để bắt đầu từ đầu.

Ví dụ bạn có ở đây sẽ hoạt động và đang hoạt động cho tôi khi tôi vừa thử.

Mẹo: Vì bạn đang sử dụng cùng giá trị trao đổi và giá trị binding_key làm tên hàng đợi, bạn không phải liệt kê rõ ràng chúng trong CELERY_QUEUES. Khi CELERY_CREATE_MISSING_QUEUES bật (theo mặc định) hàng đợi sẽ tự động được tạo chính xác như bạn có nếu bạn chỉ thực hiện celeryd -Q queue1 hoặc gửi tác vụ đến hàng đợi không xác định.