多個隊列:
Celery默認使用的隊列名為celery默認綁定在direct交換機celery,可通過CELERY_DEFAULT_QUEUE/CELERY_DEFAULT_EXCHANGE/CELERY_DEFAULT_ROUTING_KEY等參數配置修改.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2016-12-24 17:32:54 # @Author : 李滿滿 (xmdevops@vip.qq.com) # @Link : http://xmdevops.blog.51cto.com/ # @Version : $Id$ from __future__ import absolute_import # 說明: 導入公共模塊 from kombu import Queue, Exchange # 說明: 導入其它模塊 # BROKER_URL = 'amqp://root:qwertyuiop@172.24.10.1:5672//' # CELERY_RESULT_BACKEND = 'redis://172.24.10.1:6379/0' BROKER_URL = 'amqp://root:qwertyuiop@10.2.5.51:5672//' CELERY_RESULT_BACKEND = 'redis://10.2.5.51:5123/0' CELERY_TASK_SERIALIZER = 'msgpack' CELERY_RESULT_SERIALIZER = 'json' CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 CELERY_ACCEPT_CONTENT = [ 'json' , 'msgpack' ] CELERYD_MAX_TASKS_PER_CHILD = 40 CELERY_QUEUES = ( Queue( name = 'email_queue' , exchange = Exchange( 'email_exchange' , 'direct' ), routing_key = 'email' ), Queue( name = 'wixin_queue' , exchange = Exchange( 'wixin_exchange' , 'direct' ), routing_key = 'wixin' ), ) CELERY_ROUTES = { 'work.notify.email.send_mail' : { 'queue' : 'email_queue' , 'routing_key' : 'email' } } |
擴展: 多個隊列主要為了解決由於默認子進程池大小有限制,當其中一個任務消息量特別大時,那么其它重要消息可能會被被滯后處理,導致嚴重影響用戶體驗,可以根據業務實際情況將不同的任務放於不同的隊列中且指定不同的子進程數來提高整體的響應,如上分別定義了綁定到email_exchange的direct交換機的email_queue和綁定到wixin_exchange的direct交換機的wixin_queue
疑問: Queue應該是binding到交換機上,為何參數中給出的是routing_key很奇怪...?
注意: 啟動的時候並不推薦在一個worker進程中啟動這兩個隊列(celery worker -A work.app -l info),強烈建議分開進程跑(celery worker -A work.app -c 2 -Q email_queue -l info;celery worker -A work.app -c 4 -Q wixin_queue -l info),分開獨立工作進程跑,進程之間不會互相影響