简介
消息队列是生产者消费者模型的扩展,主要特点是:
- 异步:把接受到的任务放到队列里面,以后处理
- 分布式:消费者/worker 可以方便地横向扩展
关于消息队列,这篇文章有详细的介绍。
这个系列的文章主要介绍 python 消息队列的有关知识,会讲到下面几个概念:
- amqp: Adcanced Message Queue Protocol,官网在这。
- rabbitmq: Erlang 语言的amqp 协议实现
- pyamqp:python message queue 的客户端,github 页面
- kombu: message queue 的封装和抽象框架,实现了更好的接口、解决了不同客户端的一致性问题
- celery:使用 message queue 实现的分布式任务处理系统
NOTE:关于更多 message queue 的介绍和选择,可以参考 http://queues.io/ 网站,这里总结了所有常见的 message queue。
NOTE:关于其他的 python task queue,可以参考 full stack python 的总结.
名词解释
最简单的消息模型可以抽象成上图中三个概念:
- producer: 生产者负责产生和发送消息到 broker
- broker:简单起见,你可以把 broker 理解为消息的处理中心
- consumer: 消费者从 broker 中获取消息来处理。
上图的模型中,broker 只具备 message 存储功能,可能也包括重试、消息确认等特性,实际上的消息队列一般都有多个 queue,根据消息的不同特性把他们放到不同的地方,消费者也可以只处理自己感兴趣的消息,如下图所示。
实际中的例子可能是:某个网站在处理用户上传视频、发送通知、图像的压缩都放到不同的 queue里,由单独的消费者去处理;当然也有些情况下一个消息要交给多个消费者处理:比如用户上传视频之后,压缩视频的消费者和发送邮件通知的消费者都需要去处理。
- queue:存放消息的队列,一般会按照消息的特点进行分类
- fanout:把消息转发给多个消费者
- direct:将消息转发给特定的消费者
更多特性
处理前面已经提到的异步和可扩展两个主要的特性之外,消息队列还有其他的优点:
可靠性
消息队列一般会把接收到的消息存储到本地硬盘上,当消息被处理完之后从可能将其删除,这样即使应用挂掉或者消息队列本身挂掉,消息也能够重新加载。
松耦合
消息队列可以实现系统直接的解耦,不同的服务和系统之间可以通过消息队列进行通信,而不用关心彼此的实现细节,只要定义好消息的格式就行。
当然,除了上面的有点之外,message queue 也有缺点。消息队列是很重的组件,安装配置和维护会带来额外的工作量,对于小的系统来说,一般都没有引入消息队列的必要。