面试题——RabbitMQ

★1.如何保证消息的幂等性?(如何避免消息重复投递)

生产端:

在消息发送前,先查询数据库此消息是否被处理过。处理过则忽略、否则继续处理,并在处理完成后修改状态为已处理。

消费 端:

每个消息都生成全局唯一ID业务ID(BizID),以确保能识别重复的消息。


2.消息基于什么传输?

RabbitMQ是基于信道Channel)的方式进行数据传输的,几乎所有的RabbitMQAPI调用都必须通过Channel对象来实现,是客户端与RabbitMQ通信的基本单位,。信道是建立在真实TCP中的虚拟连接 ,每条TCP连接上的信道数量基本没有限制


3.如何保证消息的有序性

如果想保证消息的有序性就需要保证生产端和消费端都有序。RabbitMQ生产端只需要发送消息就可以了,消息会按顺序发送,但如果有多个消费者,轮询机制下虽然消费者虽然获取消息时是有序的,但每个消费者处理消息的速度是不一样的,就会导致去执行时无序,所以要保证一个生产者一个队列一个消费者。


4.使用RabbitMQ有什么好处?

削峰:把消息放进RabbitMQ能减轻系统压力,避免因高压而崩溃

异步:允许将消息发放到队列然后执行其他任务,后续由其他服务来异步处理这些任务

解耦:生产者和消费者独立运作,增强灵活性和可扩展性

可靠性:提供持久化,确认机制和事务处理,确保消息的可靠性和完整性


5.Rabbitmq的手动ACK和自动ACK

自动ACK:消息一旦被接收,不论是否成功处理,消费者自动执行发送ACK

手动ACK:消息被接收后,不会自动发送ACK,消费者需要手动调用ACK


6.消息怎么路由?

路由:

直连模式:通过routing key去寻找绑定的对应队列

广播模式:无视routing key,将消息发送到所有绑定的队列上

主题模式:可以使用统配符表示bingKey:'*'表示匹配一个单词, '#'则表示匹配没有或者多个单词。由此可以实现一个queue接收多个路由的消息。


7.如何解决死循环?

死信队列 :消息无法成功处理时,将消息发到死信队列中,避免无休止的循环重试。

重试机制 :在消费者设置最大重试次数,超过最大次数直接发到死信队列中。

设置TTL :给消息设置最大生存时间,超过这个时间的消息发到死信队列。


相关推荐
初次攀爬者3 小时前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者2 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧3 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖3 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农3 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者3 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端
业精于勤_荒于稀3 天前
物流订单系统99.99%可用性全链路容灾体系落地操作手册
分布式
Ronin3053 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
Asher05093 天前
Hadoop核心技术与实战指南
大数据·hadoop·分布式
凉凉的知识库3 天前
Go中的零值与空值,你搞懂了么?
分布式·面试·go