####前言
celery的官方文档其实相对还是写的很不错的.但是在一些深层次的使用上面却显得杂乱甚至就没有某些方面的介绍,
通过我的一个测试环境的settings.py来说明一些使用celery的技巧和解决办法
####amqp交换类型
其实一共有4种交换类型,还有默认类型和自定义类型. 但是对我们配置队列只会用到其中之三,我来一个个说明,英语好的话可以直接去看英文文档
首先思考一下流程:
- celerybeat生成任务消息,然后发送消息到一个exchange(交换机)
- 交换机决定那个(些)队列会接收这个消息,这个其实就是根据下面的exchange的类型和绑定到这个交换机所用的bindingkey
我们这里要说的其实就是怎么样决定第二步谁接收的问题 - Direct Exchange
如其名,直接交换,也就是指定一个消息被那个队列接收, 这个消息被celerybeat定义个一个routing
key,如果你发送给交换机并且那个队列绑定的bindingkey 那么就会直接转给这个队列 - Topic Exchange
你设想一下这样的环境(我举例个小型的应该用场景): 你有三个队列和三个消息,
A消息可能希望被X,Y处理,B消息你希望被,X,Z处理,C消息你希望被Y,Z处理.并且这个不是队列的不同而是消息希望被相关的队列都去执行,看一张图可能更好理解:
![](https://access.redhat.com/site/documentation/resources/docs/en-
US/Red_Hat_Enterprise_MRG/1.1/html/Messaging_User_Guide/images/topic-
exchange.png)
对,Topic可以根据同类的属性进程通配, 你只需要routing key有’.’分割:比如上图中的usa.news, usa.weather,
europe.news, europe.weather - Fanout Exchange
先想一下广播的概念,
在设想你有某个任务,相当耗费时间,但是却要求很高的实时性,那么你可以需要多台服务器的多个workers一起工作,每个服务器负担其中的一部分,但是celerybeat只会生成一个任务,被某个worker取走就没了,
所以你需要让每个服务器的队列都要收到这个消息.这里很需要注意的是:你的fanout类型的消息在生成的时候为多份,每个队列一份,而不是一个消息发送给单一队列的次数
####我的settings.py
这里只是相关于celery的部分:
1 |
|
版权声明:本文由 董伟明 原创,未经作者授权禁止任何微信公众号和向掘金(juejin.im)转载,技术博客转载采用 保留署名-非商业性使用-禁止演绎 4.0-国际许可协议
python