深入Celery之使用队列以及优先级提高响应

多个队列:

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),分开独立工作进程跑,进程之间不会互相影响

posted @ 2018-11-23 22:23  yugb  阅读(2522)  评论(0编辑  收藏  举报