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