Eventing Hub 是 Black-Tortoise 项目中的事件总线主指南,用于描述共享 EventBus 的事件契约、持久化与发布顺序以及消费者安全。其内容与 src/app/eventing/AGENTS.md 及 .github/instructions/20-ddd-event-sourcing-copilot-instructions.md 中描述的 EventBus 相关。
用途 该指南面向使用 Black-Tortoise 事件溯源架构的开发者,帮助统一事件的声明、持久化、发布与消费方式,确保事件驱动流程的因果一致性与数据不可变性。
主要能力
- 事件模式(Event Schema):事件需声明 Type、Payload、Metadata 与 Semantics 结构;payload 保持不可变,任何允许的变更需在 metadata 中记录。使用 correlationId 关联相关事件,并分配 causationId 指向触发事件(仅根事件的 causationId 可为 null)。只能从聚合/应用服务发出类型化事件,不得发布原始 DTO 或 Firebase 对象。
- Append → Publish → React 流程:在调用 EventBus 发布步骤之前,必须先持久化每个结果(Append);不得将 append/publish 包裹在 Promise.all 或并行流程中,以避免因果缺口。append promise 完成后,再发布事件,并让下游存储/投影通过全局 EventBus 单例进行反应。反应应限于简单投影或副作用;长时间运行的工作应交给应用层处理的专用用例。
- 因果追踪与不可变性:为每个已发布事件维护 causation/correlation ID;记录它们用于追踪,并包含在 metadata 中供审计工具使用。已发出的事件视为只读事实;消费者可以检查但绝不能修改 payload 或 metadata 对象。广播时使用 Object.freeze() 或深拷贝,确保不可变性保证传递到所有订阅者。
- 安全订阅:在应用边界使用 toSignal() 将 EventBus 背后的 RxJS 流转换为信号,然后再向展示层存储暴露数据。使用 takeUntilDestroyed() 或基于信号的清理来保护订阅,避免组件/存储销毁后事件处理器泄漏。优先使用 @ngrx/signals 存储来响应事件;其 withMethods 处理器应基于事件 payload 调用 patchState,而不是直接修改存储。
- 校验与监控:在 append 之前校验 payload 模式,使用领域值对象在领域层强制执行不变量,并尽早拒绝无效数据。当 Append 或 Publish 步骤失败时发出审计事件,以便 docs/AUDIT-* 跟踪器捕获问题上下文。将因果 ID 输入任何可观测性工具,以在 CI 或运行时追踪中验证 Append→Publish→React 链。
使用方式 该指南以文档形式提供,供开发者在实现事件溯源与 EventBus 相关代码时遵循。具体安装命令、代码示例或 API 调用方式暂未提供。
适用场景 适用于采用 Black-Tortoise 事件溯源架构、需要定义事件契约、保证发布顺序、追踪因果关系以及安全订阅事件的项目。
限制 资料未提供具体的安装命令、代码片段、收费信息、平台支持或效果说明,这些内容暂未提供。