面试题——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 :给消息设置最大生存时间,超过这个时间的消息发到死信队列。


相关推荐
User_芊芊君子27 分钟前
【分布式训练】CANN SHMEM跨设备内存通信库:构建高效多机多卡训练的关键组件
分布式·深度学习·神经网络·wpf
酷酷的崽7981 小时前
CANN 开源生态解析(四):`cann-dist-train` —— 构建高效可扩展的分布式训练引擎
分布式·开源
惊讶的猫2 小时前
AMQP 与 RabbitMQ 四大模型
分布式·rabbitmq
灰子学技术2 小时前
istio从0到1:如何解决分布式配置同步问题
分布式·云原生·istio
小马爱打代码2 小时前
ZooKeeper:入门实战
分布式·zookeeper·云原生
永远都不秃头的程序员(互关)3 小时前
CANN赋能AIGC分布式训练:硬核通信,加速大模型智能生成新纪元
分布式·aigc
像少年啦飞驰点、3 小时前
从零开始学 RabbitMQ:小白也能懂的消息队列实战指南
java·spring boot·微服务·消息队列·rabbitmq·异步编程
lekami_兰3 小时前
RabbitMQ 延迟队列实现指南:两种方案手把手教你搞定
后端·rabbitmq·延迟队列
杜子不疼.4 小时前
CANN集合通信库HCCL的大规模分布式训练通信优化与拓扑感知实践
分布式
ALex_zry16 小时前
Redis Cluster 分布式缓存架构设计与实践
redis·分布式·缓存