消息、事件与异步

共 20 题
#

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 压缩率与批量大小无关