项目概述
本项目实现进程内事件总线:类型化频道(字面量类型+载荷类型编译期检查)、订阅者按订阅顺序有序投递、每处理器 try-catch 错误隔离并发布到死信频道、每频道环形缓冲供迟来订阅者重放。发布追加缓冲并顺序调用处理器;同步处理器即调即返,异步处理器 await。重放为订阅时缓冲快照,不与新事件交错。测试双处理器断言有序收到;首处理器抛错断言次处理器仍运行且死信收到;重放断言收到最近 N 条且先于新事件;类型错误为编译期;环形溢出覆盖最旧;取消订阅后不再收到。部署单进程单总线;重放缓冲按迟来需求定容;监控死信频道。仅进程内无跨进程;无背pressure 慢处理器阻塞频道;重放缓冲有界旧事件丢失。
架构与实施
构建本地事件总线的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。
限制与后续
当前构建本地事件总线实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整node:events版本。
代码示例
pnpm init
pnpm add -D typescript tsx vitest
event-bus-local/
├── src/bus.ts
├── src/channel.ts
├── src/replay.ts
├── tests/bus.test.ts
└── package.json
bus.publish("user.created", user); // type error if payload wrong
for (const h of subs) await h(event);
try { await h(event); } catch (e) { bus.publish("bus.dead", {event, e}); }
bus.subscribe("user.created", handler, {replay: 10});
pnpm vitest run