RabbitMQ面试题

一、RabbitMQ如何保证消息的可靠性

RabbiMQ如果想要保证消息的可靠性有几种方式可以实现:

1、消费端消息可靠性保证:

1).消息确认

在消费端可以设置手动ACK模式,手动确认消息是否被正常处理,若存在异常或者未运行,则消息超时后不会被删除,会被重新投递
2).死信队列

当消息不被正常使用时,可以设置过期时间或死信交换器将消息转入死信队列中,分析处理这些消息

2、生产端消息可靠性保证:

1).消息持久化

在发布消息时,可以将消息标记为持久化(persistent),这样消息就会被持久化存储到磁盘上面,即使RabbitMQ服务器重启,消息也不会丢失
2).消息确认机制

启用confirm模式,在消费者发布消息后,由RabbitMQ服务器确认,根据确认信号判断消息是否正常路由到队列中并采取相应的重试策略

二、 如何保证消息的幂等性?

1、MQ中出现幂等性问题的主要原因

(1)生产者重复生产

当网络发生故障时,生产者可能会多次发出相同的信号

(2)MQ重复发送消息给消费者

当消费者拉取消息后,由于网络或者服务器宕机的原因,MQ没有及时响应导致超时,MQ会认为第一次消费失败再去发送一次消息,导致发送消息重复

2、解决幂等性问题的办法

  1. 状态检查:
    在消息发送出去之前,检查数据库中的消息状态是非被处理,已被处理就忽略,没有被处理则发送并标记为已处理
  2. 唯一标识:
    给消息加上一个业务ID(BizID),可以根据这个业务ID来判断两次消息是否是同一条,比如订单号,交易流水号

三、RabbitMQ中如何解决消息堆积问题

一般情况下消息堆积问题有三种解决方案:

  1. 增加更多消费者,提高消费能力
  2. 在消费者内开启线程池加快处理速度
  3. 最好的方法就是使用惰性队列,扩大队列容积
    惰性队列优点:
    基于磁盘存储,消息上限高,性能比较稳定
    但是由于是基于磁盘存储,受限于磁盘IO,时效会降低

四、如何保证消息有序性?

保证消息的有序性的办法:

  1. 单一队列:将消息都发送到一个队列里面,并确保消费者按顺序处理消息
  2. 分区排序:将消息按特定规则排序,并为每个分区维护一个队列,但不同的分区消息顺序无法保证
  3. 消息标识:给元素数据中添加序列号或者时间戳等标识,消费者处理消息时根据标记确保消息顺序
  4. 利用有序消息中间件:一些消息队列中间件提供了特定的功能来保证消息的有序性
相关推荐
一條狗5 小时前
20250219 隨筆 [特殊字符] 查看短鏈的實現方式與解決方案優化
rabbitmq·冗餘雙寫
小猫猫猫◍˃ᵕ˂◍6 小时前
rabbitmq五种模式的实现——springboot
spring boot·rabbitmq·java-rabbitmq
叫我龙翔15 小时前
【项目日记】仿RabbitMQ实现消息队列 --- 模块设计
运维·服务器·网络·c++·分布式·http·rabbitmq
程序员林北北19 小时前
【Golang学习之旅】分布式任务队列(使用 RabbitMQ / Kafka)
java·分布式·学习·云原生·golang·kafka·rabbitmq
(; ̄ェ ̄)。1 天前
在nodejs中使用RabbitMQ(七)实现生产者确认
分布式·中间件·rabbitmq
FG.2 天前
RabbitMQ服务异步通信
微服务·rabbitmq
忘忧人生2 天前
docker 安装 Rabbitmq 详解
docker·消息队列·rabbitmq
一二小选手2 天前
基于Spring Boot的RabbitMQ延时队列技术实现
spring boot·rabbitmq·java-rabbitmq
小金的学习笔记2 天前
如何在本地和线上安装和配置RabbitMQ
分布式·rabbitmq
不良人天码星2 天前
Ubuntu 的RabbitMQ安装
分布式·ubuntu·rabbitmq