任务队列:

在配置文件中设置CELERY_QUEUES和CELERY_ROUTES

CELERY_QUEUES = (

        Queue('task1',Exchange('task1',type='direct'),routing_key='task1'),

        Queue('task2',Exchange('task2',type='direct'),routing_key='task2'),

        Queue('task3',Exchange('task3',type='direct'),routing_key='task3')
        )
CELERY_ROUTES = {
'task.task1':{'queue':'task1','exchange':'task1','routing_key':'task1'},

'task.task2':{'queue':'task2','exchange':'task1','routing_key':'task2'},

'task.task3':{'queue':'task3','exchange':'task3','routing_key':'task3'},
}

四种交换器:

  • direct: 通过routingKey和exchange决定的那个唯一的queue可以接收消息

    • routing_key和exchange对应起来

  • fanout: 所有bind到此exchange的queue都可以接收消息

    • fanout是一种发布/订阅模式的交换器,当你发送一条消息的时候,交换器会把消息广播到所有附加到这个交换器的队列上

    • routing_key可以省略

  • topic:和direct类似,但是在匹配规则上进行了扩展

    • routing key为一个点号“. ”分隔的字符串(我们将被点号“. ”分隔开的每一段独立的字符串称为一个单词),如“*.task.*”、"*.*.email"、“*.add”

    • binding key与routing key一样也是句点号“. ”分隔的字符串

    • binding key中可以存在两种特殊字符“*”与“#”,用于做模糊匹配,其中“*”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

      • #.a会匹配a.a,aa.a,aaa.a等

      • *.a会匹配a.a,b.a,c.a等

      • 注:使用RoutingKey为#,Exchange Type为topic的时候相当于使用fanout

  • headers: 通过headers 来决定把消息发给哪些queue

    • 和topic交换机有点相似,但是不同于headers交换机的路由是基于路由键,headers交换机的路由值基于消息的header数据。

    • topic交换机路由键只有是字符串,而headers交换机可以是整型和哈希值

    • 用的比较少