MQ(消息中间件)
一、MQ是什么
Message Queue:消息队列,即把要传输的数据放在队列中。
MQ是接收、存储、转发消息的中间件,主要用于解决以下问题:(a.b.c)
a.解耦
b.消峰/限流:比如秒杀场景
c.异步
Message:消息体。根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
二、MQ基本原理
1.MQ本质
[一发一存一消费]
2.消息模型的进化
- 队列模型
它允许多个生产者往同一个队列发送消息。但是,一条消息只能被其中一个消费者消费,读完即被删除,不再存储。
- 发布订阅模型—广播
主题:用于存放消息,订阅者在接收消息之前需要先订阅主题,每个订阅者都可以收到同一个主题的全量消息。
与队列模式的区别:一份消息数据是否可以被多次消费。
3.MQ整体设计思路
Broker:消息服务器,MQ的服务端。作为server提供消息核心服务,为生产者和消费者提供 RPC 接口,负责消息的存储、备份和删除,以及消费关系的维护等。
Producer:消息生产者,MQ的客户端之一。作为业务的发起方,调用 Broker 提供的 RPC 接口发送消息。
Consumer:消息消费者,MQ的另外一个客户端。调用 Broker 提供的 RPC 接口接收消息,同时完成消费确认。作为业务的处理方,负责从broker获取消息并进行业务逻辑处理
4.MQ核心架构
MQ-client将消息发送给MQ-server(此时业务方调用的是API:SendMsg)—过程1
MQ-server将消息落地至db,落地后即为发送成功—过程2
MQ-server将应答发送给MQ-client(此时回调业务方是API:SendCallback)—过程3
MQ-server将消息发送给MQ-client(此时回调业务方是API:RecvCallback)—过程4
MQ-client回复应答给MQ-server(此时业务方主动调用API:SendAck)—过程5
MQ-server收到ack,将之前已经落地的消息删除,完成消息的可靠投递—过程6
三、MQ使用场景
1.系统解耦
- 解耦,可以理解为解除耦合关系,对象之间的耦合度即指对象之间的依赖性。
- 传统模式:系统间耦合性太强,系统A在代码中直接调用系统B和系统C的代码,若想接入D系统,还需要修改系统A的代码
- 使用MQ:交互系统之间没有直接的调用关系,只是通过消息传输
主系统只负责把数据写到队列中,谁想要或不想要这个数据(消息),主系统一点都不关心
系统A、B、C调用主系统,主系统压根也不关心系统A、B、C的返回
修改任一模块对其他模块影响较小
- 场景:库存变动推送前端,mq推送消息,只保证推送成功,但并不关心前端是否消费成功
2.流量削峰
- 将短时间高并发产生的事务消息存储在消息队列中,从而削去高峰期的并发事务
秒杀场景:商品:爆款、价格:较平时便宜很多、数量:少—瞬时流量:很高,无效流量:很多
用户请求,服务器接收后,首先写入消息队列,如不消费,可直接抛弃,秒杀业务根据消息队列中的请求信息,再做后续处理
四、常用MQ介绍
五、测试重点
1.数据丢失问题—如何保证消息的可靠性传输
三个方面:
生产者弄丢数据
消息队列弄丢数据
消费者弄丢数据
2. 数据重复问题—如何保证消息不被重复消费
生产者多发
消费者多收
因此:如何保证消息幂等性