首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

快速入门分布式消息队列之 RabbitMQ(下)

前言

我们在《快速入门分布式消息队列之 RabbitMQ(上)》和《快速入门分布式消息队列之 RabbitMQ(中)》分别介绍了 RabbitMQ 的对象概念及其关键特性,本篇将通过代码实现的方式来回溯这些知识点,从应用实践的角度继续深入 RabbitMQ。

首先安装 RabbitMQ 的 Python 客户端,最常用的就是 pika:

一个基本的生产者/消费者实现

通道 Channel

在代码实现之前我们还需要补充一个通讯的概念——通道

通道 channel:也被称为频道,指在 TCP 连接中建立的虚拟通信渠道。RabbitMQ 客户端与服务器之间的通讯并没有直接使用 TCP 连接,因为每一次通讯都需要创建和销毁 TCP 连接,这对操作系统来说是一笔昂贵的开销。并且 TCP 连接数量是有限制的,会成为通讯性能的瓶颈。解决该问题的方法就是在一个 TCP 连接中创建多个虚拟连接通道,而且通道的数量并没有限制,性能也很好。所以,通常我们只需要在应用程序中维护少量甚至一个 TCP 连接即可满足需求。

消费者

生产者

NOTE:如果你希望使用缺省的虚拟主机和 guest 用户时,那么 AMQP URL 应该是这样的:

运行结果

在两个终端分别运行生产者和消费者模块。

生产者:连续发送 4 次不同的消息

消费者:一直在监听队列中的消息,直到 CTRL+C 退出

可以通过 CLI 来查看队列的消息情况

NOTE:需要注意的是,上例中仅运行了一对生产者/消费者。实际上我们可以尝试同时运行多个消费者,并订阅到一个队列。这样的话,RabbitMQ 就会默认以平摊的方式将消息分别给多个消费者。

应用预取计数

因为每个消费者执行的任务长度不尽相同,如果使用平摊的方式来分配消息的话,那么任务粒度小、执行时间短的消费者就会闲置下来。解决的方法就是在消费者中应用预期计数来实现公平调度(Fair dispatch)的效果。

可见,当消费者执行的任务长度较短时,应该给予更大的预取计数,充分发挥消费者的性能。

应用 ACK 机制

应用 ACK 机制,能够保证消息的有效传递。

最后

如果你常接触 RabbitMQ,那么建议你结合上篇和中篇里提到的对象概念以及特性来浏览代码,相信会有更深的感触。除此之外,我们还可以在 RabbitMQ Tutorials 中获取更多的 Samples。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171212G05FE000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券