# 1. Emissary 模式在 API 代理、协议转换、遗留系统适配。 A Emissary 是进程内代码,必然耦合应用语言 B Emissary 作为进程外代理,可代表应用做协议转换、重试、认证与遗留系统适配,实现关注点分离 ✓ 正确答案 C Emissary 只能做协议转换,不能做重试与限流 D Emissary 与遗留系统完全无关
# 2. 异步消息的可靠投递中 ACK 机制、死信队列、重试退避与消息回溯如何设计? A 死信队列用于接收重试仍失败的消息,由专门处理,避免无限重试阻塞主队列 ✓ 正确答案 B 消息一旦投递就保证恰好一次,无需幂等 C 失败消息应无限重试,以提高成功率 D ACK 机制是消费者收到消息即删除,无需确认
# 3. Kafka 的日志存储模型中分区顺序写、页缓存与零拷贝如何支撑高吞吐,为什么日志按段删除 A Kafka 分区顺序追加写 + 页缓存 + 零拷贝提升吞吐,日志按 segment 整个删除以降低清理成本 ✓ 正确答案 B Kafka 数据随机写入,靠缓存提升吞吐 C Kafka 逐条删除过期消息以精确控制保留 D 零拷贝指把数据从用户态拷贝到内核态
# 4. Competing Consumers 在消费者并行、消息确认、失败重试的工程实现。 A 每条消息会投递给所有消费者 B 该模式天然保证全局消息顺序 C 多个消费者竞争队列中的消息,进行并行处理,处理完成才 ack,失败可重试并进入死信队列 ✓ 正确答案 D 消费者数量不能超过队列数量
# 5. 事件驱动 vs 请求驱动中什么时候事件驱动架构带来松耦合,什么时候引入调试/追踪复杂度? A 事件驱动提供时间/空间解耦与异步扩展,但带来跨服务事件链难追踪、最终一致等复杂度 ✓ 正确答案 B 事件驱动发布方依赖消费方接口,耦合强 C 请求驱动天然支持异步削峰 D 事件驱动一定比请求驱动更简单
# 6. 消息积压的治理中消费延迟(lag)如何计算,消费者扩容时分区数固定的限制如何突破? A lag 等于消费者最新提交 offset 减生产者最新 offset B Kafka 一个分区同一时刻只能被一个消费者消费,消费者数最多等于分区数,突破需增加分区或应用内多线程并发处理 ✓ 正确答案 C 消费者数量可以无限增加,与分区数无关 D 增加分区数不会影响消息顺序
# 7. 事件 Schema 治理中 Avro/Protobuf 的兼容演进,事件版本升级如何避免下游破坏? A Protobuf 新增字段必须复用已有字段编号 B 删除字段时无需保留字段编号 C 事件 schema 一旦发布就不能再增加任何字段 D Avro/Protobuf 通过新增字段带默认值、保留编号与 Schema Registry 兼容性校验,实现事件版本的向后/向前兼容演进 ✓ 正确答案
# 8. 事件溯源与消息队列的关系中事件存储作为事实源(source of truth)与重放重建? A 消息队列是事实源,事件存储只是展示 B 事件存储与消息队列职责完全相同 C 事件溯源的事件被消费后即删除,无法重放 D 事件溯源把事件存储作为事实源,状态是事件的投影,可通过重放事件重建任意状态 ✓ 正确答案
# 9. 消息消费的幂等中重复消费场景下业务去重表与状态机如何兜底? A at-least-once 下不会重复消费,无需幂等 B 去重表与业务处理必须分开两个事务 C 去重表能识别"是否已处理",状态机能兜底"业务状态是否已达成",两者在事务内提交避免重复副作用 ✓ 正确答案 D 状态机无法处理重复消息
# 10. 事件总线 vs 点对点队列中 pub/sub 广播与 work queue 竞争消费的语义差异与典型场景 A 事件总线把事件广播给所有订阅者,点对点队列让消息被竞争消费(一个消息一个消费者) ✓ 正确答案 B 点对点队列把一条消息广播给所有消费者 C 两者语义完全相同 D pub/sub 用于任务负载均衡
# 11. 消息回溯中按 offset 或时间戳重置消费位点如何用于故障恢复与重放,与死信重投的差异 A 死信重投用于重建读模型 B 两者完全相同,都是重放全部历史 C 消息回溯只能处理单条消息 D 消息回溯按 offset/时间戳重置位点,重放一段历史消息用于故障恢复与重建;死信重投针对单条失败消息重试 ✓ 正确答案
# 12. Adapter 模式在遗留系统到微服务的接口适配。 A Adapter 让新系统直接依赖遗留系统内部实现 B Adapter 只能用于 GUI,不能用于后端 C Adapter 作为翻译层,把遗留系统接口转换成新系统期望的接口,屏蔽协议与实现差异 ✓ 正确答案 D Adapter 会破坏遗留系统原有数据
# 13. Aggregator 模式在客户端聚合、API Composition 的多服务合并。 A Aggregator 让客户端自己逐个调用多个服务 B Aggregator 与 BFF 含义完全相同 C Aggregator 只能串行调用,不能并行 D Aggregator 在服务端聚合多个服务响应为一个组合响应,减少客户端往返,是 API Composition 的实现 ✓ 正确答案
# 14. 消息队列的选型矩阵中 Kafka/RabbitMQ/Pulsar 在吞吐、顺序、延迟与多租户上的差异? A Kafka 以高吞吐日志流见长,Pulsar 原生支持多租户与分层存储,RabbitMQ 路由灵活、延迟低 ✓ 正确答案 B RabbitMQ 吞吐通常高于 Kafka,但路由能力弱 C Kafka 延迟最低,适合单条实时消息 D 三者吞吐与延迟完全一致
# 15. Kafka 消费者组的 rebalance 中提交 offset 与再均衡监听器(onPartitionsRevoked/Assigned)如何配合,重复消费与丢失消费为何并存? A 自动提交能完全避免重复消费 B rebalance 不会发生重复消费 C onPartitionsRevoked 用于在分区被撤销前提交 offset,避免丢失;rebalance 下"已处理未提交"的 offset 会造成重复消费,故重复与丢失并存 ✓ 正确答案 D 手动提交会导致必然丢失消费
# 16. 消息幂等消费中重复投递场景下如何用业务唯一键去重,与 Outbox 模式的配合? A 去重记录应与业务处理分属不同事务 B 重复投递下无需去重,直接处理即可 C 用业务唯一键先查后写,同一事务内去重,实现幂等;Outbox 保证发送端可靠,二者配合实现 effectively-once ✓ 正确答案 D Outbox 用于消费端去重
# 17. Kafka 的分区与顺序中同一 key 如何保证分区内有序,跨分区全局有序为何难? A Kafka 天然保证全局有序 B 同一 key 哈希到同一分区,保证分区内有序;跨分区全局有序需单分区或单线程,代价是牺牲并行与吞吐 ✓ 正确答案 C 不同分区之间也保证全局顺序 D 分区器与 key 无关
# 18. 异步系统的可观测性中跨服务消息链路的 traceId 传播与消费延迟监控? A 异步消息无需 traceId 传播,无法追踪 B 生产者把 traceId 写入消息头,消费者取出注入上下文,使异步链路可追踪;消费延迟/lag 监控反映积压与处理健康 ✓ 正确答案 C 消费延迟监控与可观测性无关 D traceId 只能用于同步调用
# 19. RabbitMQ 的路由中 direct/topic/fanout/headers 四种 exchange 的绑定语义与适用场景 A fanout 按路由键精确匹配 B direct 广播到所有队列 C topic 支持 * 和 # 通配符按模式匹配,fanout 广播到所有绑定队列 ✓ 正确答案 D headers 按路由键匹配
# 20. 批量与压缩中 Kafka 的 batch 大小与 gzip/lz4/zstd 压缩如何影响吞吐与延迟 A batch 越大延迟越低,吞吐越低 B 压缩会降低吞吐,应禁用 C 批量累积(batch 大小与 linger.ms)提升吞吐但增加延迟;压缩(gzip/lz4/zstd)减小体积提升有效吞吐,需权衡 CPU 与延迟 ✓ 正确答案 D 压缩率与批量大小无关