Vivid

事件流

系统级发布/订阅(Subscribe、Publish)与事件投递

EventStream 是 Actor 系统级的发布/订阅机制:Actor 可订阅某一事件类型,其它 Actor 或组件可发布该类型事件,系统会将事件投递到订阅者的邮箱,与普通消息同一处理模型。通过 ctx.EventStream() 获取,与 消息投递 配合使用。

EventStream 发布/订阅
加载图表…

订阅与取消订阅

  • Subscribe(ctx, event):当前 Actor 订阅 event 所代表的事件类型。参数 event 仅用于类型识别(按类型相等),可为零值实例,例如 ctx.EventStream().Subscribe(ctx, MyEvent{})。之后所有 Publish 的该类型事件都会作为一条消息投递到该 Actor 的邮箱。订阅与发布需使用同一具体类型(同一结构体),否则收不到。
  • Unsubscribe(ctx, event):取消当前 Actor 对该事件类型的订阅。多数场景不必主动调用:Actor 被销毁时,其所有订阅会自动释放
  • UnsubscribeAll(ctx):取消当前 Actor 对全部事件类型的订阅。

订阅应在 Actor 生命周期内通过 ActorContext 完成,不要在 Actor 外持有 EventStream 或订阅状态。

发布事件

Publish(ctx, event) 向系统内所有已订阅该事件类型的 Actor 发布 event。事件会被投递到各订阅者的邮箱,由各自的 OnReceive 按类型处理。

ctx.EventStream().Publish(ctx, MyEvent{Source: ctx.Ref().GetPath(), Data: payload})

发布方传入的 ctx 用于标识来源(如 Logger);订阅方收到的是 event 本身作为 ctx.Message()

典型用法

  • 跨模块解耦:模块 A 发布领域事件,模块 B/C 只订阅感兴趣的类型,无需直接引用 A。
  • 监控与审计:订阅系统事件(如生命周期、死信),在 OnReceive 中记录或告警。死信事件类型为 ves.DeathLetterEvent,参见 消息投递 - 死信。启用集群后,可订阅 ves.ClusterMembersChangedEventves.ClusterLeaderChangedEvent 做成员与主节点变更监控,参见 集群事件
  • 与 Stash 配合:在条件未满足时 Stash 当前消息,订阅“条件就绪”事件,在 OnReceive 中收到该事件时 Unstash 并继续处理。

事件与普通消息使用同一邮箱与行为,保证顺序与一致性。

On this page