“RabbitMQ如何实现高可用”?
大家好,我是Mic,一个工作了14年的Java程序员。
下面我们来分析一下面试官对于这个问题的考察意图
考察目标
这个问题就是简单的考察RabbitMQ相关知识点的了解。
难度并不大,主要考察3年以上开发经验的同学。
但是这个问题只是一个切入点,我认为接下来会根据求职者的背景针对这个问题做更进一步去深度考察。
问题解析
在分布式架构下,高可用是最基础的设计。
也就是说,一旦依赖的某个服务出现故障,不能影响业务的正常执行。
RabbitMQ提供了两种集群模式:
-
普通集群模式
-
镜像集群模式
先来看普通集群
这种集群模式下,各个节点只同步元数据,不同步队列中的消息。
其中元数据包含队列的名称、交换机名称及属性、交换机与队列的绑定关系等。
当我们发送消息和消费消息的时候,不管请求发送到RabbitMQ集群的哪个节点。
最终都会通过元数据定位到队列所在的节点去存储以及拉取数据。
很显然,这种集群方式并不能保证Queue的高可用,因为一旦Queue所在的节点挂了,那么这个Queue的消息就没办法访问了。
它的好处是通过多个节点分担了流量的压力,提升了消息的吞吐能力。
第二种是镜像集群
它和普通集群的区别在于,镜像集群中Queue的数据会在RabbitMQ集群的每个节点存储一份。
一旦任意一个节点发生故障,其他节点仍然可以继续提供服务。
所以这种集群模式实现了真正意义上的高可用。
最后,在镜像集群的模式下,我们可以通过Keepalived+HAProxy来实现RabbitMQ集群的负载均衡。
其中:
-
HAProxy是一个能支持四层和七层的负载均衡器,可以实现对RabbitMQ集群的负载均衡
-
同时为了避免HAProxy的单点故障,可以再增加Keepalived实现HAProxy的主备,如果HAProxy主节点出现故障那么备份节点就会接管主节点提供服务。
Keepalived提供了一个虚拟IP,业务只需要连接到虚拟IP即可。
好了,这就是RabbitMQ的常见高可用实现方案。
那么在面试的时候,怎么回答比较好呢?
高手:
RabbitMQ高可用实现方式有两种,
-
第一种是普通集群模式,在这种模式下,一个Queue的消息只会存在集群的一个节点上,集群里面的其他节点会同步Queue所在节点的元数据,消息在生产和消费的时候,不管请求发送到集群的哪个节点,最终都会路由到Queue所在节点上去存储和拉取消息。
这种方式并不能保证Queue的高可用性,但是它可以提升RabbitMQ的消息吞吐能力
-
第二种是镜像集群,也就是集群里面的每个节点都会存储Queue的数据副本。
意味着每次生产消息的时候,都需要把消息内容同步给集群中的其他节点。
这种方式能够保证Queue的高可用性,但是集群副本之间的同步会带来性能的损耗。
另外,由于每个节点都保存了副本,所以我们还可以通过HAProxy实现负载均衡。
总结
大家知道怎么回答了吗?
如果你喜欢我的作品,记得点赞收藏加关注哦!!!
另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新200期,总计超过20W字!