RabbitMQ面试复习笔记(一)

一、什么是RabbitMQ?

RabbitMQ是一个基于AMQP协议的一个软件间通信的消息队列中间件。AMQP的一个具体工作机制非常简单,生产者把消息发送到一个rabbitmq broker中的一个exchange交换机上,然后交换机根据路由规则将消息发送到绑定的队列中,最后把这个消息投递给订阅了这个队列的消费者,最后实现异步通信。它常用在服务间解耦流量削峰实现异步通信这三个方面,它有四大核心:

生产者:提供消息的应用程序;

消费者:处理消息的应用程序;

队列:存储消息的区域;

交换机:消息路由的核心组件,将生产者发送的消息路由到相应的队列当中。

绑定关系(BindingKey):

表示建立queue和exchange之间的一个绑定关系,每一个关系会有一个BindingKey,通过这种方式,相当于在exchange里面建立了一个路由关系表,生产者发送消息的时候,需要声明一个routingKey,交换机拿到消息之后根据routingKey跟关系表里面的bingdingKey进行匹配,匹配的方式是根据exchangeType来决定的。

三种交换机类型(ExchangeType):

1、direct:完整的匹配,只有bindingKey和routingKey完全匹配的时候才能发送,相当于消息点对点的发送

2、fanout:广播,这种类型的交换机不会根据routingKey来进行匹配,而是将消息广播到所有跟交换机绑定了的队列

3、topic:正则表达式匹配,根据routingKey使用正则表达式去匹配bindingKey

二、RabbitMQ的应用场景

1、秒杀系统

2、服务限流

3、下单系统

三、在RabbitMQ中如何保证顺序消费?

使用一个队列作为顺序消费的队列,然后只分配一个消费者取消费这个队列。

优点是保证了消息的顺序消费,但是会降低系统的一个吞吐量。

四、RabbitMQ如何保证高可用?

RabbitMQ提供了两种集群模式:普通集群模式、镜像集群模式。

普通集群模式中,rabbitmq各个节点只同步元数据,不会同步消息数据,元数据包含队列的名称、交换机的名称和属性、交换机与队列的绑定关系。

当我们发送消息或者消费消息的时候,不管请求发送到rabbitMQ中的哪一个节点,最终都会通过元数据去定位到队列所在的节点去存储和拉取数据。

这种集群模式的架构有点类似没有主从的redis cluster集群,并没有提供高可用的能力,而仅仅是分担了流量压力、提升了消息的吞吐能力,因为一旦其中一个节点宕机了,就会有一部分数据没有办法访问到。

镜像集群模式下,因为每一个节点都会把数据全部拷贝一份,所以无论是哪一个节点出现了问题,都能访问到,并能正常的消费。

优点:实现了高可用

缺点:数据副本的同步会有性能损耗

我们还可以通过keepalived+HAProxy去实现rabbitMQ集群的负载均衡。

其中HAProxy是一个负载均衡器,可以实现rabbitmq镜像集群模式的一个负载均衡,同时为了防止HAProxy的一个单点故障,所以在HAProxy之前增加一个keepalived去实现HAProxy的主备,如果HAProxy主节点出现了故障,那么备节点就会接管继续提供服务,keepalived提供一个虚拟IP,生产者只需要连接到虚拟IP即可。

五、什么情况下,rabbitmq的消息会丢失?

1、生产者没有成功的把消息发送到rabbitmq服务;

2、生产者发送消息成功,但是rabbitmq服务在持久化未完成的时候宕机;

3、消费者在处理消息之前宕机了,rabbitmq服务以为消息已经签收。

六、如何保证消息不丢失(可靠性)?

在生产者的角度,rabbitmq提供了一个confirm消息确认机制,就是生产者向server端发送消息之后,如果消息处理成功,server端会向生产者返回一个ack消息,生产者可以根据消息的结果决定消息是否要重新发送。

在服务端的角度,需要把收到的消息持久化到磁盘。那么创建Queue的时候需要把Queue设置为持久化,生产者发送消息的时候,需要把消息的投递模式设置为持久化。(刷盘的时候还是可能会丢失,所以需要跟确认机制一起配合)

在消费者的角度,需要把消息的自动确认,从自动确认改为手动确认,这样消费者需要手动调用确认消费方法,才能表示这条消息已经签收,但是会出现重复消费的问题,所以要考虑幂等性的设计。

全部评论
Mark
点赞
送花
回复 分享
发布于 2023-06-25 17:17 湖南

相关推荐

点赞 13 评论
分享
牛客网
牛客企业服务