Files
examination/topics/interview-prep/message-queue/short_answer.json
T
wonder 0f68a64829
Deploy Examination / deploy (push) Successful in 10s
feat: add interview-prep topic group with 250 questions (6 subtopics, 5 question types)
Subtopics:
- distributed-microservice: 45 questions (分布式微服务架构)
- message-queue: 45 questions (消息队列)
- k8s-observability: 45 questions (K8s与可观测性)
- go-java-concurrency: 45 questions (Go/Java并发模型)
- database-advanced: 35 questions (数据库进阶)
- ai-engineering: 35 questions (AI工程实践)

Question types: single_choice, true_false, fill_blank, short_answer, code_reading
2026-09-09 16:36:27 +08:00

148 lines
13 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"topic": "message-queue",
"type": "short_answer",
"schema_version": "1.0.0",
"generated": "2026-09-09T15:30:00+08:00",
"questions": [
{
"id": "sa-001",
"type": "short_answer",
"difficulty": 2,
"tags": [
"kafka",
"cluster",
"durable"
],
"question": "简述 Kafka 中 ISR(In-Sync Replicas)机制的工作原理,以及它如何影响消息的可靠性保证。",
"answer": "ISR 是 Kafka 中与 Leader 保持同步的副本集合。当 Producer 发送消息时,通过 acks 参数控制可靠性级别:acks=0 不等待确认(可能丢消息);acks=1 等待 Leader 写入成功;acks=all/-1 等待所有 ISR 副本都写入成功后才返回确认。Follower 副本通过从 Leader 拉取数据保持同步,当 Follower 落后超过 replica.lag.time.max.ms 配置的时间时会被移出 ISR。Leader 选举时只会从 ISR 中选择新 Leader,从而保证已确认的消息不会丢失。ISR 机制在可靠性和可用性之间提供了灵活的平衡:ISR 越小,可用性越高但可靠性越低;ISR 越大,可靠性越高但写入延迟可能增加。此外,unclean.leader.election.enable 参数控制是否允许非 ISR 副本参与选举,进一步影响一致性与可用性的取舍。",
"keywords": [
"ISR",
"Leader",
"Follower",
"同步副本",
"acks",
"选举",
"可靠性和可用性权衡"
],
"scoring_rubric": "提到 ISR 定义(与 Leader 同步的副本集合)得 1 分;说明 acks 参数的三种级别及其影响得 1 分;解释 Follower 同步机制与 ISR 成员变化得 1 分;说明 ISR 与 Leader 选举的关系得 1 分;提及可靠性和可用性的权衡得 1 分。满分 5 分。",
"explanation": "ISR 是 Kafka 分布式消息系统中最核心的可靠性机制之一。理解 ISR 需要掌握:(1) Kafka 采用 Leader-Follower 副本模型,只有 Leader 处理读写;(2) Follower 通过拉取方式同步 Leader 数据;(3) 只有在 ISR 中的副本才有资格被选为新 Leader;(4) Producer 的 acks 配置决定了消息写入需要多少副本确认。这三个方面共同构成了 Kafka 的消息可靠性保证体系。面试中需要能清晰阐述各配置项的含义以及它们如何相互配合。",
"source": null,
"related": []
},
{
"id": "sa-002",
"type": "short_answer",
"difficulty": 5,
"tags": [
"rocketmq",
"transactional-message",
"exactly-once"
],
"question": "请详细解释 RocketMQ 事务消息的实现机制(半消息机制),并对比 Kafka 的事务消息方案,分析两者在实现 Exactly-Once 语义上的差异。",
"answer": "RocketMQ 事务消息采用半消息(Half Message)机制,核心流程分为四步:(1) Producer 先发送半消息到 Broker,消息对消费者不可见(处于 PREPARE 状态);(2) Producer 执行本地事务;(3) 根据本地事务执行结果,向 Broker 发送 COMMIT 或 ROLLBACK 命令;(4) 若 Broker 长时间未收到确认,会主动回查 Producer 的本地事务状态。事务消息存储在 Topic %RETRY% 下,通过回查机制(最多 15 次)保证最终一致性。Kafka 事务消息则基于 Transaction Coordinator 和 PID(Producer ID)机制:Producer 向 Coordinator 注册并获取 PID 和 Epoch,通过两阶段提交(AddPartitionsToTxn + EndTxn)实现事务。Kafka 事务是跨分区的,可以原子性地写入多个分区;RocketMQ 事务消息是单条消息级别的原子性。Exactly-Once 语义方面:RocketMQ 依赖事务消息+消费端幂等(MessageKey 去重)来近似实现;Kafka 通过幂等 Producer(PID+序列号去重)+ 事务消息的组合实现端到端 Exactly-Once,但消费者需要配合 read_committed 隔离级别。",
"keywords": [
"半消息",
"PREPARE",
"COMMIT",
"ROLLBACK",
"回查",
"Transaction Coordinator",
"PID",
"Exactly-Once",
"两阶段提交",
"幂等"
],
"scoring_rubric": "准确描述 RocketMQ 半消息的四步流程得 2 分;说明回查机制得 1 分;描述 Kafka 事务的 Coordinator+PID 机制得 2 分;对比两者在事务粒度上的差异(单条 vs 跨分区)得 1 分;分析 Exactly-Once 实现路径的差异得 1 分。满分 7 分。",
"explanation": "事务消息是消息队列中的高级话题,面试中常以对比形式考察。RocketMQ 的半消息机制是其独创设计,核心在于消息先投递但对消费者不可见,通过二次确认和回查机制保证事务的最终一致性。Kafka 的事务模型更偏向流处理场景,支持跨分区原子写入,但不提供消息回查机制。理解两者的差异需要掌握分布式事务的基本理论(两阶段提交、最终一致性),以及各自中间件的内部实现细节。这个题目难度较高,考察对底层机制的深入理解。",
"source": null,
"related": []
},
{
"id": "sa-003",
"type": "short_answer",
"difficulty": 3,
"tags": [
"dead-letter-queue",
"retry",
"message-trace"
],
"question": "什么是死信队列(Dead Letter Queue)?请说明死信产生的常见原因、典型的重试与处理策略,以及如何通过死信队列实现消息回溯。",
"answer": "死信队列(DLQ)是专门存放无法被正常消费的消息的特殊队列。死信产生的常见原因包括:(1) 消息格式非法或反序列化失败;(2) 消费逻辑抛出异常且达到最大重试次数;(3) 消息 TTL 过期;(4) 队列/Topic 满了导致消息被拒绝;(5) 消费者显式拒绝消息(如 RabbitMQ 的 basic.reject 或 basic.nack 且 requeue=false)。典型处理策略:(1) 退避重试:指数退避 + 最大重试次数,避免雪崩;(2) 死信队列消费:专门的消费者进程监听死信队列,进行人工审核或告警;(3) 消息修复与重放:修复后将消息重新投递到原队列;(4) 消息回溯:RocketMQ 支持按时间戳回溯消费(reconsume),Kafka 支持通过 --offset 重置消费者位点来回溯历史消息。消息追踪方面,可以通过在消息中嵌入 TraceID,配合链路追踪系统(如 SkyWalking、Jaeger)实现端到端的消息追踪和死信消息的全链路定位。",
"keywords": [
"死信队列",
"DLQ",
"重试",
"TTL",
"指数退避",
"回溯",
"TraceID",
"链路追踪"
],
"scoring_rubric": "准确定义死信队列得 1 分;列举至少三种死信产生原因得 1 分;说明退避重试策略得 1 分;描述死信队列的消费和处理方式得 1 分;说明消息回溯的具体方法得 1 分。满分 5 分。",
"explanation": "死信队列是消息系统可靠性设计的重要环节。生产环境中,消息消费失败是不可避免的,关键是如何优雅地处理这些失败消息。面试者需要理解死信队列不仅是'存放失败消息的地方',更是一套完整的异常消息处理体系,包括重试策略、告警机制、人工介入流程和消息回溯能力。理解 RabbitMQ、RocketMQ、Kafka 各自在死信处理上的差异也很重要。",
"source": null,
"related": []
},
{
"id": "sa-004",
"type": "short_answer",
"difficulty": 3,
"tags": [
"push-pull",
"consumer-group",
"rebalance"
],
"question": "对比消息队列中 Push 和 Pull 两种消费模式的优缺点,并说明 Long Polling 如何结合两者的优势。在消费者端流控和 Rebalance 方面,这两种模式分别面临哪些挑战?",
"answer": "Push 模式(Broker 主动推送给消费者):优点是实时性高、延迟低;缺点是 Broker 无法感知消费者处理能力,可能导致消费者过载(消息堆积)、背压控制困难。Pull 模式(消费者主动拉取消息):优点是消费者自主控制消费速率,天然支持流控和背压;缺点是存在轮询开销,实时性依赖拉取间隔。Long Polling(长轮询)结合两者优势:消费者发起拉取请求后,Broker 不立即返回空结果,而是等待有新消息或超时后才响应,既减少了无效轮询开销,又保证了实时性,同时保留了消费者端的流控能力。RabbitMQ 原生使用 Push 模式(basic.deliver),通过 prefetch 机制做流控;Kafka 和 RocketMQ 使用 Pull 模式,Kafka 的 high-level consumer 使用 long polling(fetch.min.bytes 配置等待时间)。Rebalance 方面:Push 模式下 Broker 需要维护每个消费者的状态,rebalance 时需要通知所有消费者;Pull 模式下消费者通过 consumer group 协议自行协调分区分配,rebalance 时会触发位点迁移,可能导致短暂的重复消费或消息延迟。Kafka 的 Rebalance 有 Eager(全停全分)和 Cooperative(增量分配)两种策略,后者可以减少 stop-the-world 影响。",
"keywords": [
"Push",
"Pull",
"Long Polling",
"prefetch",
"背压",
"流控",
"Rebalance",
"Eager",
"Cooperative",
"fetch.min.bytes"
],
"scoring_rubric": "准确对比 Push 和 Pull 的优缺点各得 1 分;说明 Long Polling 的结合优势得 1 分;讨论流控/背压挑战得 1 分;分析 Rebalance 相关挑战得 1 分。满分 5 分。",
"explanation": "推拉模式是消息队列的基础架构设计问题。面试中需要能清晰地对比两种模式的本质差异,理解 Long Polling 的工程价值,以及在生产环境中 Rebalance 带来的实际挑战(如消费暂停、重复消费、位点丢失等)。Kafka 的 Cooperative Rebalance 是近年的重要改进,了解这个演进能体现对技术发展的关注。",
"source": null,
"related": []
},
{
"id": "sa-005",
"type": "short_answer",
"difficulty": 4,
"tags": [
"kafka",
"rocketmq",
"pulsar",
"topic",
"partition",
"cluster"
],
"question": "从消息模型、持久化架构、运维复杂度、适用场景四个维度,对比 Kafka、RocketMQ 和 Apache Pulsar 三款消息中间件的异同,并给出各自的最佳适用场景。",
"answer": "消息模型:Kafka 采用 Topic-Partition 模型,消费者通过 offset 顺序消费,天然适合流式处理;RocketMQ 采用 Topic-Queue 模型,支持 Tag 和 Key 进行消息过滤和路由,更适合业务消息场景;Pulsar 采用 Topic-Partition + Segment 存储分离模型,支持多租户和租户级别的资源隔离,同时兼容 Kafka 的消费语义。持久化架构:Kafka 使用 Broker 本地磁盘顺序写 + PageCache + 零拷贝(sendfile),写入性能极高但存储与计算耦合;RocketMQ 类似,使用 CommitLog + ConsumeQueue 的双层存储结构,CommitLog 顺序写所有消息,ConsumeQueue 存储索引;Pulsar 采用 BookKeeper 存储层,实现了计算存储分离,写入 BookKeeper 后异步落盘,支持分层存储(Tiered Storage)。运维复杂度:Kafka 中等,依赖 ZooKeeper(新版本移除),分区再均衡需关注;RocketMQ 较简单,NameServer 无状态易部署,运维工具完善;Pulsar 较高,需要同时运维 Broker + BookKeeper + ZooKeeper 三个组件。适用场景:Kafka 适合大数据流处理、日志采集、实时数仓(高吞吐场景);RocketMQ 适合电商交易、金融核心链路、事务消息场景(可靠性和消息过滤需求);Pulsar 适合多租户 SaaS 平台、跨地域多活、需要存储计算分离的大规模消息平台。",
"keywords": [
"Topic",
"Partition",
"Queue",
"Tag",
"CommitLog",
"ConsumeQueue",
"BookKeeper",
"计算存储分离",
"零拷贝",
"多租户",
"Tiered Storage",
"ZooKeeper"
],
"scoring_rubric": "消息模型维度对比准确得 1 分;持久化架构维度对比准确得 1 分;运维复杂度维度对比准确得 1 分;适用场景划分合理得 1 分;总体表述清晰、有深度得 1 分。满分 5 分。",
"explanation": "三大消息中间件的对比是面试高频题。关键不在于死记参数,而在于理解设计哲学的差异:Kafka 以高吞吐和流处理为核心,追求极致的顺序写和零拷贝性能;RocketMQ 脱胎于电商场景,强调消息的可靠投递和灵活路由;Pulsar 则是新一代架构,通过计算存储分离解决 Kafka 的存储扩展性问题。面试者需要展现出对架构演进的理解,能够根据具体业务场景给出合理的选型建议。",
"source": null,
"related": []
}
]
}