Purpose
The framework publishes lifecycle and cluster events so that external components (monitoring, logging, dashboards) can observe the actor system without coupling to internal implementation. Subscribers receive events as they occur—actor started, actor stopped, node joined, dead letter, and so on.API
The
eventstream.Subscriber interface:
Message structure
Each message has:- Topic —
msg.Topic()returns the topic (e.g.topic.events, the internal topic). - Payload —
msg.Payload()returns the event. Use a type assertion to handle specific events.
Event types
The system publishes these events to the event stream:Usage
Iterator() returns a channel that drains buffered messages and then closes. Messages enqueued concurrently with (or after) the call may not be included. For continuous observation, loop over Iterator() or use a dedicated goroutine that reads from the channel.
Implementation notes
- The event stream is backed by the
eventstreampackage. The actor system creates anEventsStreamat startup and subscribes callers to the internal topictopic.events. - Lifecycle events (ActorStarted, ActorStopped, etc.) are published by the PID and death-watch logic. Cluster events (NodeJoined, NodeLeft) are published by the cluster events loop when membership changes.
LeaderChangedis published from the same loop, on every node, whenever a topology event reveals that the coordinator moved to a different node; the initial coordinator election on startup is not published, only subsequent transitions. RelocationFailedis published by the relocator when a departed node’s actors or grains cannot be re-deployed. Each item is retried a bounded number of times with backoff before it is reported, and the report is terminal: the relocation run does not revisit failed items, so subscribe to this event to drive your own recovery (for example, re-spawning the affected actors or alerting).RelocationStartedis published by the leader whenever it starts relocating a departed node’s actors and grains, for graceful shutdowns and crashes alike.BestEffort()distinguishes the two: false means the set comes from the departed node’s graceful-shutdown snapshot and is complete; true means the node crashed and the set was reconstructed from the replicated cluster registry, so records lost with the crashed node’s partitions cannot be listed, and an empty or unexpectedly small set signals suspected record loss. See the relocation page for the replication settings that govern completeness.- Dead letters are published by the dead-letter actor when messages cannot be delivered.
- The event stream is always present; no option is required. It is independent of
WithPubSub()and cluster mode.
Related
- Observability — Metrics and dead letters
- PubSub — Application-level topic-based pub/sub (separate mechanism)