天天看点

RabbitMQ消息队列

一、消息队列

消息队列就是一种<code>先进先出</code>的数据机构

当在分布式系统中的时候,不同的机器需要做数据交互,所以涉及到不同机器之间的数据交互,这样的话就需要借助专业的消息队列,常见的消息队列有 RabbitMQ 、Kafka...他们都是开源且支持语言较多。

消息队列解决的问题:

应用解耦

流量消峰:

如果订单系统一秒最多能处理一万次订单,这个处理能力在平时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。

但是使用消息队列,就可以取消这个限制,把这一秒内的订单放入队列中分散成一段时间来处理,这样用户就可能在下单几十秒后才能收到下单成功的操作,但是比不能下单要好。

消息分发:

当A发送一次消息,B对消息感兴趣,就只需监听消息,C感兴趣,C也去监听消息,而A完全不需要改动。

异步消息(Celery 就是对消息队列的分装)

RabbitMQ 和 Kafka

RabbitMQ :吞吐量小,有消息确认(对消息可靠性有要求,就用它)

Kafka:吞吐量高,注重高吞吐量,不注重消息的可靠性,数据量特别大

二、按装RabbitMQ

1、原生安装:

2、docker拉取

三、基本使用

生产者:

消费者:

四、确认机制

消息确认机制其实就是消费者中 auto_ack 的设置

生产者不变

五、持久化

队列持久化:就是在声明队列的时候,指定持久化<code>durable=True</code>,队列必须是新的才可以

消息持久化:就是在发布消息的时候添加

六、闲置消费

当正常情况下如果有多个消费者,那么就会按照顺序第一个消息给 第一个消费者,第二个消息给第二个消费者

但是当第一个消息的消费者处理信息很耗时,一直没有结束,那么就可以让第二个消费者优先获取闲置消息。

七、发布订阅

发布订阅就是:我可以有多个订阅者来订阅你的消息,这样发布者只需要发布一条, 我的所有只要订阅你的人都可以消费你的消息

模型:当我的订阅者起来了之后,就会创建一个队列,多个订阅者就会创建多个队列,当发布者生产了消息之后,会传给 exchange ,然后 exchange 会把消息复制分别分发到订阅者创建的队列中,这样就实现了只要监听你,那就能收到你发的消息。

发布者:

订阅者:启动多次,都绑定到了同一个 exchange,所以就会都收到同一个 exchange 分发的消息

需要设置 exchange_type 的类型为 direct

并且在发布消息的时候设置多个关键字:routing_key

在订阅者中也需要设置 exchange_type 的类型 direct

并且当订阅者绑定 exchange 的时候也需要设置 routing_key,

这样的话在发布者发布消息后,exchange 会根据发布者和订阅者设置的 routing_key 进行匹配,当订阅者的 routing_key 匹配上了发布者的 routing_key 的话,那么订阅者就可以接收到发布者发布的消息,反之收不到消息。

消费者1:

消费者2:

在订阅者绑定匹配的时候可以进行模糊匹配发布者的 routing_key ,匹配上了就能接收到发布者发布的消息

订阅者:

八、python中的RPC框架

RPC :远程过程调用

例如:两个服务调用,服务1通过网络调用服务2的方法。

自带的:数据包大,速度慢

服务端:

客户端:

第三方的:底层使用 ZeroMQ 和 MessagePack ,速度快,响应时间短,并发高。

学习之旅