领域事件与架构风格

共 20 题
#

1. Domain Event 的不可变性(immutability)中事件一旦发布即不可修改

A 事件发布后可以修改字段
B 事件是已发生事实,必须不可变,字段 final 且无 setter ✓ 正确答案
C 事件不可变会影响并发消费
D 事件可被多个消费者各自修改
#

2. Domain Event(领域事件)的发布时机中聚合状态变更后立即 vs 事务提交后

A 聚合变更后立即发布最安全
B 事务回滚也应发布事件
C 事件发布时机与事务无关
D 推荐事务提交后发布,配合 Outbox 保证事件与业务状态一致 ✓ 正确答案
#

3. Event Sourcing 中 Snapshot 策略(每 N 个事件、性能 vs 存储)

A 快照越少越好
B 快照定期保存状态以加速重放,N 的大小权衡恢复速度与存储成本 ✓ 正确答案
C 快照会破坏事件溯源
D 快照频率越高存储越省
#

4. 领域事件的「幂等消费」中消息重投导致的事件重复处理如何用事件 ID 去重、版本号与状态机保证只生效一次?

A 用事件 ID 去重、版本号与状态机保证重复事件只生效一次 ✓ 正确答案
B 重复处理事件没有副作用
C 幂等消费无需去重
D 消息中间件保证只投递一次
#

5. 事务性发件箱(Transactional Outbox)中事件与业务事务同库写入后由 relay 发布,如何保证不丢失、不重复且顺序可控?

A 事件与业务同库同事务写入 outbox,由 relay 发布,配合幂等实现不丢不重 ✓ 正确答案
B 业务与事件分开两个事务
C Outbox 无法保证不丢失
D relay 直接发布即可无需确认
#

6. 领域事件的 Schema 治理中事件字段的兼容性规则与版本化,消费者升级顺序如何编排避免破坏性变更?

A 新增字段带默认值保持向后兼容,破坏性变更需版本化,消费者先升级再发布 ✓ 正确答案
B 事件字段可随意删除
C 事件 schema 无需版本化
D 先发新事件再升级消费者
#

7. Event Sourcing 中 Upcasting(事件版本升级)的演化策略

A 历史事件直接改写为新版本
B 事件 schema 不能演进
C Upcasting 在读取时把旧版本事件升级到新 schema,无需重写历史 ✓ 正确答案
D Upcasting 会破坏事件溯源
#

8. Event-Carried State Transfer(事件携带状态)中消费者免回查

A 事件只携带事件 ID
B 事件携带状态无需版本控制
C 消费者必须回查生产者
D 事件携带完整状态,消费者免回查,用版本号处理陈旧事件 ✓ 正确答案
#

9. Eventual Consistency(最终一致性)的 SLA 与传播延迟

A 最终一致无需监控
B 最终一致没有时间要求
C 所有场景延迟要求一致
D 需定义"多久内收敛"的 SLA,并监控传播延迟与积压来治理 ✓ 正确答案
#

10. CQRS 架构的边界中写模型与读模型分离的工程收益与代价

A CQRS 没有代价
B CQRS 适用于所有系统
C 读写分离带来独立优化与扩展,但引入最终一致与模型双份的复杂度 ✓ 正确答案
D 读写模型必须共享同一表
#

11. EDA(Event-Driven Architecture)的事件总线与发布/订阅模型

A 生产者直接调用消费者
B 生产者发布事件到总线,消费者订阅事件类型,互相解耦 ✓ 正确答案
C 事件驱动没有事件总线
D 生产者必须知道所有消费者
#

12. 事件总线 vs 消息中间件(Kafka/RabbitMQ)的选型中事务性发件箱、消息顺序保证、分区键设计在事件驱动架构中的工程取舍?

A 跨服务可靠投递用 Kafka/RabbitMQ,相关事件用相同分区键保证顺序 ✓ 正确答案
B 分区键与顺序无关
C 消息中间件不保证持久化
D 进程内事件总线也适合跨服务
#

13. 领域事件与集成事件的边界中内部订阅用领域事件、对外发布用集成事件,事件翻译与契约独立如何设计?

A 领域事件直接对外发布
B 领域事件用于内部订阅,跨上下文用集成事件,通过翻译层独立契约 ✓ 正确答案
C 两者完全等同
D 集成事件暴露内部模型
#

14. 事件消费失败的重试与死信中指数退避、重试上限、死信队列与人工介入流程如何设计?

A 无限重试即可
B 失败事件直接丢弃
C 指数退避重试 + 重试上限,超限进死信队列并人工介入 ✓ 正确答案
D 重试无需幂等
#

15. Domain Event 的元数据(metadata)中发生时间、触发者、traceId

A 事件只应有业务数据
B traceId 没有用处
C 元数据含发生时间、触发者、traceId 等,用于审计、追踪与幂等 ✓ 正确答案
D 元数据应混入业务字段
#

16. Domain Event 的命名(过去时动词中 OrderCreated、PaymentCompleted)

A 事件用将来时动词
B 事件名应技术化
C 事件用过去时动词表达已发生事实,如 OrderCreated ✓ 正确答案
D 事件命名与命令相同
#

17. 事件驱动 vs 请求驱动中何时用事件?

A 事件驱动保证强一致
B 所有操作都应用事件驱动
C 需要即时响应与强一致用请求驱动,可异步、多响应方、可最终一致用事件驱动 ✓ 正确答案
D 请求驱动只能用于查询
#

18. 事件溯源与 CQRS 中读写模型分离?

A 两者必须同时使用
B 事件溯源不能配 CQRS
C 事件溯源可作为写模型,CQRS 的读模型由事件投影生成,读写分离 ✓ 正确答案
D 读模型直接从事件流查询
#

19. 架构风格选型中分层、六边形与事件驱动?

A 所有系统都用一种架构
B 六边形架构取消依赖方向
C 简单系统用分层,核心领域复杂用六边形,高并发解耦用事件驱动,可组合 ✓ 正确答案
D 事件驱动适合所有系统
#

20. 事件的发布与订阅中可靠投递?

A 消息中间件保证恰好一次
B 消费无需幂等
C 用 Outbox 保不丢 + 持久化至少一次投递 + 消费幂等去重 ✓ 正确答案
D 事件可能丢失属正常