1. 程式人生 > >深入Celery之使用佇列以及優先順序提高響應

深入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  : 李滿滿 ([email protected])

@Link    : http://xmdevops.blog.51cto.com/

@Version : $Id$

from __future__ import absolute_import

# 說明: 匯入公共模組

from kombu import Queue, Exchange

# 說明: 匯入其它模組

# BROKER_URL = 'amqp://root:[email protected]:5672//'

# CELERY_RESULT_BACKEND = 'redis://172.24.10.1:6379/0'

BROKER_URL = 'amqp://root:[email protected]: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),分開獨立工作程序跑,程序之間不會互相影響