Files
examination/topics/interview-prep/message-queue/fill_blank.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

189 lines
9.3 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": "fill_blank",
"schema_version": "1.0.0",
"generated": "2026-09-09T16:12:31+08:00",
"questions": [
{
"id": "fb-001",
"type": "fill_blank",
"difficulty": 1,
"tags": [
"kafka",
"durable"
],
"question": "Kafka 中消息被追加到 Topic 的______末尾,这种写入方式被称为______写。",
"answer": [
"partition",
"append-only"
],
"answer_rule": "all",
"explanation": "Kafka 中 Topic 是逻辑概念,实际数据存储在 Partition(分区)中。每个 Partition 本质上是一个有序的、不可变的消息序列,新消息只能追加到末尾(append-only),这种顺序写方式极大减少了磁盘寻址开销,是 Kafka 高吞吐量的核心设计之一。",
"source": null,
"related": []
},
{
"id": "fb-002",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"rocketmq",
"transactional-message"
],
"question": "RocketMQ 事务消息采用______消息机制:先发送半消息(Half Message)给 Broker,本地事务执行成功后再发送______(Commit/Rollback)指令,Broker 据此决定是否投递该消息。",
"answer": [
"two-phase",
"commit"
],
"answer_rule": "all",
"explanation": "RocketMQ 的事务消息基于两阶段提交思想。第一阶段发送 Half Message,此时消息对消费者不可见;第二阶段根据本地事务执行结果发送 Commit(提交,消息投递)或 Rollback(回滚,消息丢弃)。若 Broker 长时间未收到第二阶段指令,会主动回查生产者本地事务状态,确保最终一致性。",
"source": null,
"related": []
},
{
"id": "fb-003",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"kafka",
"durable",
"zero-copy"
],
"question": "Kafka 利用操作系统的______系统调用实现零拷贝技术,将磁盘文件数据直接传输到网络 Socket,避免了用户态与内核态之间的数据拷贝。",
"answer": [
"sendfile"
],
"answer_rule": "all",
"explanation": "零拷贝(Zero-Copy)是 Kafka 高性能消费的关键技术。传统 I/O 需要经历:磁盘→内核缓冲区→用户缓冲区→内核 Socket 缓冲区→网卡,涉及多次拷贝和上下文切换。Kafka 通过 sendfile 系统调用,让数据直接从 PageCache 传输到网卡,仅需一次内核态操作,显著降低了消费延迟和 CPU 开销。",
"source": null,
"related": []
},
{
"id": "fb-004",
"type": "fill_blank",
"difficulty": 2,
"tags": [
"dead-letter-queue"
],
"question": "当消费者连续消费某条消息失败超过最大重试次数后,该消息会被投递到______队列,以避免阻塞后续正常消息的消费。",
"answer": [
"dead-letter",
"死信"
],
"answer_rule": "any",
"explanation": "死信队列(Dead Letter Queue,DLQ)是消息中间件中处理消费失败消息的重要机制。当消息消费失败次数超过配置的阈值(如 RocketMQ 默认 16 次重试),Broker 会将该消息转入死信 Topic。运维人员可以对死信队列中的消息进行人工排查、修复后重新投递或直接丢弃,防止问题消息无限重试阻塞消费流程。",
"source": null,
"related": []
},
{
"id": "fb-005",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"kafka",
"transactional-message"
],
"question": "Kafka 事务机制中,生产者通过______ API 开启事务,所有跨分区的消息写入在该事务内是原子性的,即要么全部提交,要么全部回滚。",
"answer": [
"initTransactions / beginTransaction"
],
"answer_rule": "any",
"explanation": "Kafka 事务支持通过 Producer 的 initTransactions() 方法初始化事务协调器,然后在 sendMessages 过程中调用 beginTransaction() 开启事务,最后通过 commitTransaction() 或 abortTransaction() 提交或回滚。事务消息通过 Transaction Coordinator 和 __transaction_state 内部 Topic 来管理事务状态,保证跨分区的原子性写入,实现 Exactly-Once 语义。",
"source": null,
"related": []
},
{
"id": "fb-006",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"kafka",
"cluster"
],
"question": "Kafka 集群中,每个 Partition 有一个 Leader 和多个______副本。只有 Leader 处理读写请求,Follower 仅负责同步数据。当 Leader 宕机时,Controller 从满足条件的 Follower 中选举新 Leader。",
"answer": [
"Follower",
"follower"
],
"answer_rule": "any",
"explanation": "Kafka 采用 Leader/Follower 主从架构。ISR(In-Sync Replicas)是与 Leader 保持同步的副本集合。Controller(集群中的一个 Broker)负责管理 Partition 的 Leader 选举。当 Leader 宕机,Controller 优先从 ISR 中选择第一个存活的 Follower 作为新 Leader,保证数据一致性。若 ISR 全部不可用,根据 unclean.leader.election.enable 配置决定是否允许不同步的副本接管。",
"source": null,
"related": []
},
{
"id": "fb-007",
"type": "fill_blank",
"difficulty": 3,
"tags": [
"push-pull",
"consumer-group"
],
"question": "Kafka 消费者采用______模式获取消息,消费者主动向 Broker 拉取数据。当某个消费者组中某个消费者宕机时,Broker 会触发______,将该消费者的 Partition 分配给组内其他消费者。",
"answer": [
"pull",
"rebalance"
],
"answer_rule": "all",
"explanation": "Kafka 采用 Pull(拉)模式,消费者根据自身处理能力主动从 Broker 拉取消息,相比 Push 模式有更好的流量控制能力。当 Consumer Group 中有消费者加入或离开时,会触发 Rebalance(重平衡),重新分配 Partition 的消费归属。Rebalance 期间消费暂停,因此需合理设置 session.timeout.ms 和 heartbeat.interval.ms 来平衡故障检测速度与误判风险。",
"source": null,
"related": []
},
{
"id": "fb-008",
"type": "fill_blank",
"difficulty": 4,
"tags": [
"rocketmq",
"kafka",
"topic"
],
"question": "RocketMQ 相比 Kafka,原生支持______机制,允许生产者在发送消息时附加 Tag,消费者可通过 Tag 过滤订阅感兴趣的消息,减少不必要的网络传输。",
"answer": [
"Tag",
"tag",
"消息过滤"
],
"answer_rule": "any",
"explanation": "RocketMQ 在 Topic 之下引入了 Tag 概念,生产者发送消息时可设置 Tag(如 OrderCreate、OrderCancel),消费者订阅时通过 Tag 表达式(如 * 或 || 或 &&)过滤消息。Broker 端支持基于 Tag 的服务端过滤,减少消费者拉取无关消息。Kafka 则依赖消息 Key 或消息体内容在客户端侧过滤,原生不支持服务端 Tag 过滤。",
"source": null,
"related": []
},
{
"id": "fb-009",
"type": "fill_blank",
"difficulty": 4,
"tags": [
"kafka",
"durable"
],
"question": "Kafka 的高性能写入依赖操作系统的______作为磁盘和网络之间的缓冲区。写入时数据先写入该缓存区,再由后台线程异步刷盘。若配置 acks=all 且______,则消息写入不会丢失。",
"answer": [
"PageCache",
"min.insync.replicas >= 2"
],
"answer_rule": "all",
"explanation": "Kafka 利用 PageCache(页缓存)实现高效的写入:生产者的消息先写入内核 PageCache,由 OS 后台线程异步刷盘(flush),避免同步 I/O 阻塞。配合 acks=all(所有 ISR 副本确认)和 min.insync.replicas >= 2 的配置,即使单个 Broker 宕机,只要 ISR 中还有其他副本持有数据,消息就不会丢失。这种设计在吞吐量和可靠性之间取得了平衡。",
"source": null,
"related": []
},
{
"id": "fb-010",
"type": "fill_blank",
"difficulty": 5,
"tags": [
"kafka",
"pulsar",
"transactional-message"
],
"question": "Kafka 的 Exactly-Once 语义通过幂等生产者(Producer)和______机制结合实现:幂等 Producer 为每条消息分配序列号,Broker 据此去重;事务机制则保证跨 Partition 写入的原子性。在消费端,需配合手动提交______和幂等消费逻辑才能端到端保证不丢不重。",
"answer": [
"transaction",
"offset"
],
"answer_rule": "all",
"explanation": "Kafka Exactly-Once 语义(EOS)由三层保障实现:(1) 幂等 Producer(enable.idempotence=true)通过 Producer ID + Sequence Number 在 Broker 端去重单分区内重复消息;(2) 事务机制(Transactional API)保证跨分区原子写入;(3) 消费端需配合 consumer.commitSync() 手动提交 offset,确保消费与提交在同一事务中完成(配合 transactional.id),再结合业务幂等(如数据库唯一键)实现端到端 Exactly-Once。",
"source": null,
"related": []
}
]
}