一.消息中间件
MQ全称为(Message Queue) 消息队列是应用程序和应用程序之间的通信方法。
为什么使用MQ
在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
开发中消息队列通常有如下应用场景:
1、任务异步处理
将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
一个下单操作耗时:20 + 300 + 300 + 300 = 920ms
用户点击完下单按钮后,需要等待920ms才能得到下单响应,太慢!处理速度慢, 积压在系统的请求就更多 , 占用的系统资源就越多 , 系统的吞吐量就越低
用了MQ就会
用户点击完下单按钮后,只需等待25ms就能得到下单响应 (20 + 5 = 25ms), 提升用户体验和系统吞吐量(单位时间内处理请求的数目)。
2、应用程序解耦合
MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。
3、削峰填谷
假设平常时段我们的系统每秒最多可以处理1000个用户请求 , 但是某一时刻请求瞬间增多, 每秒有5000甚至10000个请求访问系统, 这个时候服务器承载不了就会导致服务器崩溃
使用了MQ就可以规避一些风险!
使用了 MQ 之后,限制消费消息的速度为1000,这样一来,高峰期产生的数据势必会被积压在 MQ 中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,直到消费完积压的消息,这就叫做“填谷”。
4.常用的MQ
目前业界有很多的 MQ产品,例如 RabbitMQ、RocketMQ、ActiveMQ、Kafka、MetaMq等,也有直接使用 Redis充当消息队列的案例,而这些消息队列产品,各有侧重,在实际选型时,需要结合自身需求及 MQ 产品特征,综合考虑。下面是常见MQ产品的对比
二.RabbitMQ的工作模式(端口是:5672)
RabbitMQ是基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在各种系统开发中应用非常广泛。
RabbitMQ官方地址:www.rabbitmq.com/
RabbitMQ常见的5种工作模式:简单模式,work模式,发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式
官网对应模式介绍:www.rabbitmq.com/getstarted.…
1. 简单模式(一对一) Producer(生产者) Consumer(消费则)
P:生产者,也就是要发送消息的程序 C:消费者:消息的接收者,会一直等待消息到来 queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息, 一个生产者发消息, 一个消费者消费消息
2. WorkQueues模式(一对多)
Work Queues:与简单模式相比,多了一个或一些消费端,一个生产者生产消息, 多个消费者轮流消费消息 , 适用于任务过重或任务较多情况 ;
3. Pub/Sub模式(发布与订阅模式)
在订阅模型中,过程略有变化: Exchange:交换机(X)
P:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)
C:消费者,消息的接收者,会一直等待消息到来
Queue:消息队列,接收消息、缓存消息
整个消息收发过程多了一个 Exchange 角色,Exchange主要有二方面的作用 :
一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。
Exchange有常见以下3种类型:
Fanout:广播,将消息交给所有绑定到交换机的队列
Direct:定向,把消息交给符合指定routing key 的队列
Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
! Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与 Exchange 绑定,或者没有符合路由规则的队列,那么消息会丢失!
4. Routing模式(路由模式)
路由模式: 是一种消息投递的规则, 给每一个队列绑定一个Routing Key , 在发送消息的时候每条消息也会有一个Routing Key , 交换机在投递消息的时候不再把消息交给每一个绑定的队列,而是根据消息的 Routing Key 进行判断,只有消息的 Routing key 和队列的Routing key完全一致,才会向队列投递消息
Routing模式中会为消息和队列都指定Routing key :
P:生产者,向 Exchange 发送消息,发送消息时,会指定一个routing key
X:Exchange(交换机),接收生产者的消息,然后把消息递交给与 routing key 完全匹配的队列
C1:消费者,其所在队列指定了需要 routing key 为 error 的消息
C2:消费者,其所在队列指定了需要 routing key 为 info、error的消息
5. Topics模式(通配符模式)
Topic 类型与 Direct 相比,都是可以根据 Routing Key 把消息路由到不同的队列。
只不过 Topic 类型Exchange 可以让队列在绑定 Routing key 的时候可以使用通配符!
通配符有二种:
# : 匹配0个或多个词
* : 匹配不多不少恰好1个词
例如:item.# 能够匹配 item.insert.abc 或者 tem.insert,item.* 只能匹配 item.insert