Python 实现 RabbitMQ 的六种工作模式(附 Python 代码)
上一篇介绍了在 Mac 环境下,RabbitMQ 的安装,这篇来详细介绍一下 RabbitMQ 的六种工作模式。
其实,这篇文章中的大部分内容都可以从 RabbitMQ 官网得到,包括每种工作模式的说明,以及多种语言的代码实例。
但是,如果你没有时间看英文文档,或者想看到一些总结性的内容,还是可以继续读下去的。
首先,来看一下整体的架构图,并介绍一些基本概念:
channel: 信道是生产者,消费者和 RabbitMQ 通信的渠道,是建立在 TCP 连接上的虚拟连接。一个 TCP 连接上可以建立成百上千个信道,通过这种方式,可以减少系统开销,提高性能。
Broker: 接收客户端连接,实现 AMQP 协议的消息队列和路由功能的进程。
Virtual Host: 虚拟主机的概念,类似权限控制组,一个 Virtual Host 里可以有多个 Exchange 和 Queue,权限控制的最小粒度是 Virtual Host。
Exchange: 交换机,接收生产者发送的消息,并根据 Routing Key 将消息路由到服务器中的队列 Queue。
ExchangeType: 交换机类型决定了路由消息的行为,RabbitMQ 中有三种 Exchange 类型,分别是 direct、fanout、topic。
Message Queue: 消息队列,用于存储还未被消费者消费的消息,由 Header 和 body 组成。Header 是由生产者添加的各种属性的集合,包括 Message 是否被持久化、优先级是多少、由哪个 Message Queue 接收等,body 是真正需要发送的数据内容。
BindingKey: 绑定关键字,将一个特定的 Exchange 和一个特定的 Queue 绑定起来。
了解了基本概念之后,就开始写代码吧。本文使用 Python 开发,需要先安装 Pika,版本信息如下:
RabbitMQ:3.8.3
Python:3.7.3
Pika:1.1.0
简单模式 Hello World
说明: 最简单的一对一模式,一个生产者,一个消费者,这个没什么可多说的。
生产者代码:
执行完代码之后,通过管理控制台可以看到,已经有一个叫 hello 的队列了,而且里面有一条消息,就是我们刚才发送过去的。
消费者代码:
工作队列模式 Work Queues
说明:一对多模式,一个生产者,多个消费者,一个队列,每个消费者从队列中获取唯一的消息。
有两种消息分发机制,轮询分发和公平分发:
轮询分发的特点是将消息轮流发送给每个消费者,在实际情况中,多个消费者,难免有的处理得快,有的处理得慢,如果都要等到一个消费者处理完,才把消息发送给下一个消费者,效率就大大降低了。
而公平分发的特点是,只要有消费者处理完,就会把消息发送给目前空闲的消费者,这样就提高消费效率了。
生产者代码:
消费者代码:
发布/订阅模式 Publish/Subscribe
说明:生产者将消息发送给 broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。消费者监听自己的队列并进行消费。
生产者代码:
消费者代码:
路由模式 Routing
说明:生产者将消息发送给 broker,由交换机根据 routing_key
分发到不同的消息队列,然后消费者同样根据 routing_key
来消费对应队列上的消息。
生产者代码:
消费者代码:
主题模式 Topics
说明:其实,主题模式应该算是路由模式的一种,也是通过 routing_key
来分发,只不过是 routing_key
支持了正则表达式,更加灵活。
生产者代码:
消费者代码:
RPC 模式 RPC
说明:通过消息队列来实现 RPC 功能,客户端发送消息到消费队列,消息内容其实就是服务端执行需要的参数,服务端消费消息内容,执行程序,然后将结果返回给客户端。
生产者代码:
消费者代码:
总结
以上就是本文的全部内容,其中 Publish/Subscribe,Routing,Topics 三种模式可以统一归为 Exchange 模式,只是创建时交换机的类型不一样,分别是 fanout、direct、topic。
如果有一些概念不是很懂,把代码运行一下也许就都明白了,动手是十分重要的。文中源码都是可以直接运行的,并且会上传到 GitHub 上,文末会有链接。
以上。
源码链接:
https://github.com/yongxinz/tech-blog/tree/master/rabbitmq/src
参考文档:
https://www.rabbitmq.com/getstarted.html
https://juejin.im/post/5d627d1f51882540df07e430
https://www.jianshu.com/p/80eefec808e5
https://www.cnblogs.com/frankyou/p/5283539.html
版权声明: 本文为 InfoQ 作者【AlwaysBeta】的原创文章。
原文链接:【http://xie.infoq.cn/article/02f4007cb22f991ee49882efa】。文章转载请联系作者。
评论