一.什么是MQ
其实就是不同的程序之间的一种的通信方式,通过将消息发送到中间件里面然后中间件就会将这个消息发送给相应的服务进行一个消息的消费,这个时候就会进行一些的业务逻辑的处理,这个方式提高了整个系统的可靠性,拓展性以及灵活性.常见的类型为Aapache Kafaka,RabbitMQ,RocketMQ,但是一般的话现在都是用RocketMQ这个的话后面我会说他们之间的区别
二.MQ中的重要的组件以及作用
五大组件
NameServer: 这个就是存储Broker的地址值当生产者以及消费者需要使用或者生产MQ中的消息的时候那么就会从NameServer中获取其的地址值除此之外还会通过发送心跳然后检测Broker处于健康的状态这样的话其实也就是能够更新地址值,保证了存储的数据的准确性
Broker: 这个就是将生产者发送到队列中的数据进行持久化的处理防止数据的不丢失
Producer:生产者就是将需要消费者实现业务逻辑发送到MQ中,如上图可以看出生产者就是下单服务,那么用户进行下单之后肯定是要进行扣库存的所以发送扣减库存的消息到MQ
Consumer:就是消费生产者发送到MQ中的消息然后根据这个消息进行相对应的业务逻辑的处理如:库存服务消费消息之后那么就会对商品进行扣减库存的处理
Queue:这个就是可以理解为用于存放消息的一个中转站
特别说明:为了提高效率,消费者以及生产者以及Broker都是集群进行部署,除此以外Broker启动之后向NameServer发送心跳是长连接并且是30s发送一次心跳
三.为什么要使用MQ(MQ的作用)
主要说的就是三大作用: 异步,削峰,解耦实现了整个系统的高性能以及高可用性
对比上面两个图片其实不难发现添加了MQ之其实真正在架构上实现了异步以及解耦的,因为当我们的下单系统发送消息给MQ的时候,MQ可以保证消息不丢失,后面的话那么只要交给MQ来进行处理就行了,MQ就会将消息发送给账户系统以及库存系统,他们实现了业务逻辑处理之后那么就会回调我们的下单系统的接口. 对于削峰的话,其实就是客户端在一段时间的范围之内发送大量请求(高并发),这个时候我们可以将用户的请求放在MQ中然后系统进行慢慢消费,不至于在一段时间的范围之内给我们的系统过多的压力,不然的话有可能就会使得我们的系统不能正常运行
四.MQ的选型
RocketMQ | Kafka | RabbitMQ | |
开发语言 | 全由java开发 | 部分java开发 | 基于erlang开发 |
吞吐量 | 万级别 | 十万级别 | 十万级别 |
时效性 | 毫秒级 | 毫秒级 | 微秒级 |
特点 | 1.由于都是由Java进行底层的开发,那么我们可以进行定制化的修改更符合企业的开发 2.由阿里进行开发,经十几年的双11依然保持稳定 3.支持延迟消息以及事务型消息 | 最大的特点就是其的吞吐量特别大所以常用于车辆的消息的发送 | 延迟比较低并且支持多个协议 在以前经常进行使用但是由于 停更一段时间那么使得很少有 企业进行使用了 |
五.MQ消息发送的模式
1.同步发送:
在这种模式下.发送者向MQ发送消息之后那么需要等待Broker持久化之后需要给其发送完成响应,生产者接收到响应之后才会执行后面的代码逻辑,所以这个就会产生一个致命的缺点,由于网络抖动的原因如果生产者没有接收到响应之后那么就会一直进行等待这个时候就使得整体的一个性能下降。
2.异步发送:
对于这个模式,对于相较于同步发送,生产者发送消息给MQ之后,不需要等待Broker持久化之后发送响应之后再执行后面的业务逻辑代码,实现就是通过实现一个异步的回调接口,如果Broker持久化之后就会通过我们提供的回调接口发送相应结果,那么这个的优势就是在于生产者如果没有接收到异步响应的话那么也会执行业务逻辑
3.单向发送:
使用这种模式的话那么生产者要负责发送消息,不需要接收到响应这个模式其的最大的优点就是在于速度特别快但是最大的缺点就是在于可靠性比较低所以在现在真实的企业开发中是不会使用这种的发送模式的现在更多使用的就是异步发送模式