rabbitmq面试问题总结
2022-11-19 本文已影响0人
隔壁小新
1.rabbitmq的工作原理图
![]()
- 组件说明
1 broker:消息队列进程,此进程包括exchange和queue.
2 exchange:消息队列交换机,按照一定的规则将消息转发到某个队列,对消息进行过滤
3 queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方
4 producer:消息提供方,即消息生产方客户端,生产方客户端将消息发送到MQ
5 Consumer :消息消费方,即消费方客户端,接受MQ转发的消息。
2.rabbitmq消息发送过程:
1.生产者与broker建立TCP链接
- 生产者与broker建立链接通道channel
- 生产者通过通道消息发送给broker,由Exchange将消息进行发送
- exchange将消息转发给指定的queue
3.rabbitmq消息发送过程:
- 消费者与broker建立tcp链接
- 消费者和Broker建立通道
- 消费者监听指定的queue
- 当有消息到达queue时broker默认把消息推送给消费之
- 消息接收并且消费
4.rabbitmq的工作模式:
work queues工作队列
![]()
多个队列同时消费一个队列中的消息,消息不能被重复消费,rabbitmq通过轮询的方式将消息平均分配给消费者
publish/subscribe 发布/订阅模式
image.png
一个生产者推送消息给交换机,由交换机将消息转发到绑定此交换机的每个队列里。
routing 漏油模式
image.png
一个交换机绑定多个队列,每个队列设置了routekey ,并且一个队列可以设置多个routekey, 交换机通过消息的routekey进行与队列匹配,发送消息给到匹配上的队列中
topics模式
image.png
交接机通过通配符匹配对数据进行投递
- topics模式和路由模式的区别: 路由模式的相等匹配,而topics模式是通配符匹配
- header模式
header模式与routing模式的不同之处是,header模式取消了routingkey,使用header中的key/value(键值对)进行匹配
5.消息队列的使用场景:
解耦,异步,削峰
1 解耦场景分析:
没有使用消息队列的时候,A服务需要调用多个服务去实现功能:
image.png
使用消息队列后,A服务只需要关注自己的业务,通过消息中间件去发送这些消息给其他服务。
image.png
异步场景分析
没有使用消息中间件:所以业务都是串行进行,增加了用户的等待时间,并且有些非主要任务不需要用户一直等待,
引入中间件后,用户的操作只是处理最重要的功能,当其他非主要功能使用通过消息中间件去处理这些任务。- 削峰场景描述:当同一时刻大量请求涌入,是服务器请求过载,造成服务阻塞被打死的情况,使用rabbitmq使过多请求进入rabbitmq中,从而缓解服务器的压力。
6.使用rabbitmq后服务的缺点有:
- 系统的可用性降低
- 系统的复杂性增加
7.rabbitmq如何保证高可用性
- rabbitmq支持三种模式: 1.单机,2.集群,3.镜像集群模式
- 单机模式:demo级任务
- 集群模式:当启动三台机子,在当中的一个服务创建了一个队列,当前的机子就有了这个消息的元数据和数据,而其他服务只有当前消息的元数据,当消费者链接其中的一个机子进行获取数据的时候,服务会找到他的元数据,通过元数据中的地址信息到别的机子上找到存储,当前数据的那个机子,如果存储数据的机器挂掉,数据就会丢失
-镜像集群模式:当消息被写在其中一个服务的话,其他的机器也会进行通过更新获取当前的数据,缺点:当一个数据很大的话,其他机子也会全部满额。
7.如何保证消息不会被重复消费:
- 幂等性解释: 就是一个相同的数据给你来了多变,需要确定对应的数据,不会因为多次的发送而发送改变。
- 1.对获取到的信息记录到对应的表中,每次查询当前数据是否已经被消费过了,从而避免消息的重复消费。
-2. 对修改的数据加入一个唯一键值判断,每次都把消息的id放入,当这条消息被消费过的话,当前的插入就会报错,不能重复的插入。
8.如果保证rabbitmq的消息不会出现丢数据的问题
- 生产者的情况: 生产者处理丢失数据的情况rabbitmq有两种方法:1)事物机制但是需要同步等待;2)confirm模式,通过回调方法去判断数据是否发送成功,异步,不需要线程等待。
- rabbitmq端: 对数据进行磁盘化操作,
- 消费者端:关闭自动ACK,每次消费完成需要手动ack通知rabbitmq当前消息已经消费完毕。
9.如何保证数据的顺序性,
1.对一个队列只是使用一个服务进行消费,保证每次消费完队列中的消息后再去消费第二条消息。