Java高级后端 · 全套面试通关手册(RabbitMQ)
核心思路生产者 - 交换机 Exchange - 队列 Queue - 消费者AMQP 协议。1.基础概念BrokerRabbitMQ 服务实例一个 Broker 包含多个 VirtualHost。VirtualHost(vhost)虚拟主机隔离资源交换机、队列可以分配权限类似数据库的库。Exchange 交换机接收生产者消息根据路由规则转发到队列。Queue 队列存储消息等待消费者消费。Binding 绑定交换机和队列之间的绑定关系绑定需要 routingKey。RoutingKey 路由键生产者发送消息携带用来匹配绑定规则。BindingKey 绑定键绑定时指定交换机根据 routingKey 匹配 bindingKey。4 种交换机类型⭐高频Direct直连routingKey 完全匹配 bindingKey消息发送到对应队列。点对点场景。Fanout广播忽略 routingKey消息分发到所有绑定该交换机的队列。群发、通知场景。Topic主题模糊匹配。*匹配一个单词#匹配 0 或多个单词。日志分类最常用。Headers不使用 routingKey通过消息 header 属性匹配性能差很少使用。2.消息可靠三大可靠性生产者、Broker、消费者(1)生产者消息投递确认保证消息成功到达 BrokerConfirm 确认机制生产者开启 publisher-confirm-type。消息到达 Broker 返回 ack失败返回 nack。异步回调。Return 退回机制消息到达交换机但是找不到匹配队列消息退回生产者。Confirm 保证消息成功抵达 exchangeReturn 保证消息成功路由到 queue。(2)Broker 持久化宕机不丢消息交换机持久化durabletrue队列持久化durabletrue消息持久化deliveryMode2三者都配置消息写入磁盘。但刷盘是操作系统异步极端断电仍可能丢失。(3)消费者消息确认 ACK防止消息丢失、重复消费自动 ACK默认消息分发成功就自动 ack。消费者还没处理完宕机 → 消息丢失生产禁用。手动 ACK业务处理成功调用basicAck处理失败basicNack拒绝可以 requeuetrue 重回队列requeuefalse 丢弃 / 转入死信。basicReject一次拒绝单条消息。生产推荐手动 ACK。3.死信队列 DLX重点死信消息无法被正常消费变成死信。 触发死信条件消息被 nackrequeuefalse消息 TTL 过期队列消息数量达到最大长度DLX 原理给普通队列绑定死信交换机消息变成死信自动转发到死信交换机路由到死信队列。适用场景延时队列、失败消息归档重试。RabbitMQ 没有原生延时队列TTLDLX 模拟延时队列缺陷队列过期是在消息出队时检测不是消息到期立刻转发。4.消息重复消费幂等MQ 无法避免重复投递网络抖动ack 丢失Broker 重复推送。解决方案业务端实现幂等唯一消息 ID数据库唯一索引Redis 记录已消费消息 id状态机根据业务状态判断是否处理口诀MQ 不保证只投递一次只能保证至少投递一次 at-least-once5.消息堆积问题⭐面试高频原因消费者消费速度远低于生产速度消费者宕机消费逻辑阻塞。解决方案排查消费代码优化消费逻辑去掉慢 IO增加消费者数量提高消费能力同一队列多消费者轮询消费批量消费堆积严重临时扩容队列分流紧急场景可以丢弃无效消息注意不要盲目提高 prefetch。prefetch 是预取数量。Prefetch预取basicQos (prefetchCount)告诉 MQ 一次性预取 N 条消息给消费者未 ack 前不再推送。 作用流量控制防止消费者一次性被压爆。6.消息丢失全链路总结生产者丢消息 → 开启 ConfirmReturn Broker 丢消息 → 交换机、队列、消息持久化 消费者丢消息 → 关闭自动 ACK使用手动 ACK7.其他高频知识点(1)集群模式普通集群消息只存在单个节点其他节点仅元数据访问其他节点会转发。镜像队列RabbitMQ3.8 后弃用消息同步到多个节点高可用。仲裁队列 Quorum Queue3.8 推荐Raft 协议数据多副本替代镜像队列高可用。(2)消费模式轮询默认消息均匀分给多个消费者公平分发配合 prefetch谁处理完给谁下一条(3)事务RabbitMQ 支持生产者事务channel.txSelect性能极差生产几乎不用优先 Confirm。高频深挖面试题Q1AMQP 和 Kafka 的协议区别RabbitMQ AMQP 是应用层协议Kafka 自定义二进制协议。AMQP 面向消息投递可靠性Kafka 面向高吞吐。Q2为什么不推荐用事务改用 Confirm事务同步阻塞性能差Confirm 异步回调吞吐量更高。Q3死信队列 TTL 两种设置方式消息级别 TTL每条消息单独过期时间队列级别 TTL队列内所有消息统一过期。队列 TTL 更推荐。Q4什么是 At most once / At least once / Exactly onceAt most once最多一次可能丢消息自动 ack At least once至少一次可能重复手动 ack生产常用 Exactly once恰好一次MQ 做不到业务幂等实现。Q5仲裁队列和镜像队列区别镜像队列全节点同步性能差3.8 废弃仲裁队列基于 Raft少数副本不可用仍可读性能更好。一句话背诵总结RabbitMQ 基于 AMQP4 种交换机 Direct/Fanout/Topic/Headers消息可靠性分生产者 Confirm、Broker 持久化、消费者手动 ACK死信队列 DLX 处理过期 / 拒绝消息MQ 只能保证至少投递一次业务实现幂等解决重复消费消息堆积优化消费能力Quorum 仲裁队列作为高可用方案。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →