面试题_ Rabbit MQ

一:使用场景

1、RabbitMQ的五种工作模式?

1、单发单接收:
使用场景:简单的发送与接收,没有特别的处理。
在这里插入图片描述

2、单发多接收:
使用场景:一个发送端,多个接收端,如分布式的任务派发。为了保证消息发送的可靠性,不丢失消息,使消息持久化了。同时为了防止接收端在处理消息时down掉,只有在消息处理完成后才发送ack消息。
在这里插入图片描述

3、发布、订阅模式:
在这里插入图片描述

4、Routing (按路线发送接收):
使用场景:发送端按routing key发送消息,不一样的接收端按不一样的routing key接收消息。
在这里插入图片描述

5、Topics (按topic发送接收):
使用场景:发送端不仅按固定的routing key发送消息,而是按字符串“匹配”发送,接收端一样如此。
在这里插入图片描述

2、rabbitmq 的具体使用场景?

1、SpringBoot下RabbitMq实现定时任务
定时任务场景:订单下单15分钟未付款自动关闭
在这里插入图片描述
根据上图看出我们需要两个队列(一是死信队列,消息在里面度过TLL(过期)时间,二是处理队列,消息度过TLL时间后进入该队列),两个交换机和路由(一是用来将消息送入死信队列,二是将消息从死信队列送到处理队列),但是交换机其实可以用同一个,也就是一个交换机搭配两个路由的方式。

2、流量削峰
假设我们有一个电商网站,在大型促销活动期间可能会遇到大量订单请求。这种情况下,订单处理系统可能无法应对高并发请求,导致性能下降或系统崩溃。为了解决这个问题,我们可以引入 RabbitMQ 作为消息中间件。在用户下单时,我们将订单请求作为消息发送到 RabbitMQ 的消息队列。订单处理系统作为消费者从队列中获取消息并进行处理。这样可以实现异步处理,提高系统的响应速度。同时,消息队列可以作为缓冲区,暂时存储大量订单请求。在高峰期,即使订单处理系统无法立即处理所有请求,消息队列也可以确保请求不会丢失。当消费者有空闲资源时,可以从队列中取出消息进行处理。

MQ 有哪些常见问题?如何解决这些问题?

MQ 的常见问题有:

1、消息的顺序问题:
消息有序指的是可以按照消息的发送顺序来消费。假如生产者产生了 2 条消息:M1、M2,假定 M1 发送到 S1,M2 发送到 S2,如果要保证 M1 先于 M2 被消费,怎么做?
解决方案:
方案一:拆分多个 queue(消息队列),每个 queue(消息队列) 一个 consumer(消费者),就是多一些 queue(消息队列)而已,确实是麻烦点;
方案二:或者就一个 queue (消息队列)但是对应一个 consumer(消费者),然后这个 consumer(消费者)内
部用内存队列做排队,然后分发给底层不同的 worker 来处理。

2、消息的重复问题:
正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;
造成消息重复的根本原因是:网络不可达。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?
解决方案:消费端处理消息的业务逻辑保持幂等性。只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样。比如:在写入消息队列的数据做唯一标示,消费消息时,根据唯一标识判断是否消费过;保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现。利用一张日志表来记录已经处理成功的消息的 ID,如果新到的消息 ID 已经在日志表中,那么就不再处理这条消息。

RabbitMQ基本概念?

由Exchange、Queue、RoutingKey三个才能决定一个从Exchange到Queue的唯一的线路。
------------------------------------------
Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列
Queue: 消息队列载体,每个消息都会被投入到一个或多个队列
Binding: 绑定,它的作用就是把exchange和queue按照路由规则绑定起来
Routing Key: 路由关键字,exchange根据这个关键字进行消息投递
Producer: 消息生产者,就是投递消息的程序
Consumer: 消息消费者,就是接受消息的程序
Channel: 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务

如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?

一、生产者:消息到交换机–开启Confirm方式:channel.confirmSelect()。
二、交换机到消息队列:return确认机制: channel.addReturnListener()。
三、消息队列:消息持久化,就下面两步
a. 将queue的持久化标识durable设置为true,则代表是一个持久的队列
b . 发送消息的时候将deliveryMode=2
四、消费者: 处理消息成功后,手动回复确认消息,channel.basicAck()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值