事件与 webhook 平台
事件平台(modules/eventing,LIVE)将引擎的进程内事件总线变为一个
对外的订阅面。总线本身是至多一次(at-most-once)且在关机时丢弃的,而本模块则是
持久性边界:一旦事件被捕获进捕获事务,投递就是持久且可审计的。它的路由挂载在
/v1/m/eventing/ 之下。
一个订阅记录了它所要的事件类型、一个可选的来源过滤器、一个消费方端点 URL、其投递所
授权的角色,以及一个由服务端生成的 HMAC 签名密钥(仅返回一次,此后只通过密封静态存储
(sealed-at-rest)的接缝持有)。可订阅的类型来自一份类型化目录——GET /event-types
返回每个类型及其稳定性层级和对其设门控的权限。管理订阅是特权且受审计的操作:
create/update/rotate-secret 属写入层;delete、replay、redeliver 和测试投递属管理员层。
投递是带消费方幂等键的至少一次(at-least-once)——精确一次(exactly-once)已被拒绝, 因为它是一个虚假的承诺。每个被捕获的事件会为每个匹配的订阅生成一行持久投递记录,并在同一 事务中入队。工作进程通过乐观版本号认领记录(在高可用下安全),POST 经签名的事件信封, 然后要么确认(2xx),要么安排下一次尝试:
- 重试/退避——408/425/429/5xx 和网络错误按退避计划重试;任何其他状态都是终止性的。 从不跟随重定向。
- 死信队列——耗尽尝试次数的投递落入
dead状态;denied状态记录了一次针对单个事件的 RBAC 拒绝。 - 游标回放——一个按租户单调递增的序列(从游标行分配,而非
max(seq))让你能从持久日志中 的某一点回放,受保留窗口限制。
每次尝试都携带 Stripe 风格的带时间戳 HMAC-SHA256 签名,外加一个稳定的事件 id 作为幂等键。 在每次尝试之前,调度器会针对该订阅的角色运行完整的默认拒绝(deny-closed)RBAC+ABAC 管道, 因此一个外发事件被过滤的方式与一次实时读取完全相同。