java面试:有了解过消息队列mq吗,详细讲解一下
mq消息队列作为java面试当中常考的一个知识点,mq是有重大的意义的,而其基本设计思路和项目整体构成是具有许多的实际意义的,今天我们就着重从mq的具体实现意义和其设计实现的基本实现框架思路做一个讲解。
1.为什么我们需要消息队列mq
我们可以考虑一个业务场景,就是两个不同的服务交互一般是通过发送RPC请求,而通过这种方式来实现的业务交互就会导致一个强耦合的问题,当某一个服务发生变更,就会直接影响依赖它的所有上下游服务,这样的业务耦合性太高了,同时RPC请求的调用速度还极慢,上游服务需要等待下游服务完全执行完才能调用返回结果。
针对这种情况,我们需要更好的方案去实现两个服务的交互,如果上游服务能发送消息直接通知下游服务,让下游服务接受到通知然后直接做操作就方便了,因此我们第一时间就想到了用队列的数据结构去解决这个问题,具体实现流程如下:

这种模式被称之为队列模式,也叫点对点模式,这个模式总体来说就是生产者发送消息,而让多个消费者抢占消费,但最终只能由一个消费者来消费,这个设计模式是存在缺陷的,假设想要多个消费者消费一条信息,就需要复制多个相同的队列来解决,但这样就导致消费者和消息队列是属于强绑定的关系,去除一个消费者就要去除其对应的队列,这样在解耦方面依旧不是最优选,还存在浪费空间资源的问题。
因此我们提供了另一种思路,就是通过消费者去订阅某个主题来解决这种问题,这样消费者就不用强绑定某一个元素了,这样消费者就不再依赖队列,而是通过订阅topic来解决问题,这种模式下,topic还可以存储多个队列,这样队列就可以实现横向拓展了。

这样通过上述步骤我们就设计出了消息队列,很神奇。
2.消息队列mq的broker工具
多个topic需要管理,于是统一进行管理,因此mq设计了一个叫做broker的工具来对topic进行管理,生产者的信息就会先存入broker当中,然后传递给消费者,但是这样设计就会导致数据直接存储在内存中,重启后数据就丢失了,所以数据要在磁盘中做持久化。

3.消息mq的主从设计
但是mq的设计存在单点故障问题,所以需要做一个主从来解决,这样主节点就单独来做写入,而从节点就单独来做读操作,主节点会将数据逐步写入从节点当中,这样就能有效解决单点故障的问题。

4.消息mq的集群设计
如果只有主从结构,这样会导致内存容量的问题,同时主节点并发写能力也是有瓶颈,所以mq就设计了集群来部署多个主从结构来将数据文件分散各个数据文件当中,这样降低节点的压力。
5.mq的注册中心的
当出现多个broker主从之后,就很难知道数据应该发送到哪个broker中,同时消费者也不知道该从哪个broker去获取数据,这就需要一个注册中心去统一管理这些数据,
1.注册中心需要保存集群管理的状态信息,定时上报心跳,通过实时的检测来获取到数据得知节点是否上下线,进而防止数据传到无效的节点上。
2.注册中心需要保管消息的路由,来保证消息中生产者数据应该发送到哪个broker中,消费者从哪个broker去获取数据.
3.注册中心需要管理好数据的故障转移和负载均衡,而为了保证mq的高可用性,mq自己也要做集群来解决这个问题。

6.mq的运行流程
broker集群定时向注册中心去发送心跳包,上报自身的消息,而注册中心获取所有的路由配置,而生产者和消费者通过注册中心得知自己需要从哪个broker中发送和获取消息。
今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于消息队列mq的问题得到进一步的提升,在面试的时候能从容面对面试官。
