Skip to main content

Overview

GoAkt supports multiple clusters across datacenters. A pluggable control plane (NATS JetStream or etcd) propagates topology and placement decisions across sites. Actors can be spawned or messaged across DCs. Each datacenter runs its own cluster; the control plane coordinates which DCs are active and where to route cross-DC traffic.

Architecture

  • Control plane: Manages datacenter registration, heartbeats, state transitions, and event watching. Implementations: NATS JetStream, etcd.
  • DC leader: Only the cluster leader in each DC runs the datacenter controller. It registers the local DC with the control plane using cluster members’ remoting addresses.
  • DataCenterRecord: Each DC has a record: ID, metadata (Name, Region, Zone, Labels), Endpoints (remoting addresses), State, LeaseExpiry, Version.

When to use

  • Geographic distribution: Run actors close to users or data in different regions.
  • Disaster recovery and failover: Replicate or fail over to another DC.
  • DC-aware placement: Spawn actors in a specific datacenter via SpawnOn with WithDataCenter.

Control planes

  • NATS: Package: datacenter/controlplane/nats. Use case: Lightweight, good for cloud-native setups.
  • etcd: Package: datacenter/controlplane/etcd. Use case: Strong consistency, Kubernetes-friendly.

NATS

NATS

etcd

etcd

Configuration

Multi-DC requires cluster mode. Configure the datacenter via WithDataCenter on the cluster config:
Configuration
Endpoints for cross-DC routing are not set in config; the cluster leader registers the local DC with the control plane using cluster members’ remoting addresses.

Datacenter config options

  • HeartbeatInterval: How often the DC renews its liveness lease. Default: 10s.
  • CacheRefreshInterval: How often the DC registry cache is refreshed. Default: 10s.
  • MaxCacheStaleness: Max age of cached DC data before routing is restricted. Default: 30s.
  • FailOnStaleCache: If true, SpawnOn with WithDataCenter returns ErrDataCenterStaleRecords when cache is stale. If false, proceeds with best-effort routing. Default: true.
  • WatchEnabled: Use watch-based cache refresh when the control plane supports it. Default: true.

Data center states

  • REGISTERED: Record exists but not yet eligible for routing.
  • ACTIVE: Eligible for routing as long as lease is valid.
  • DRAINING: Avoid new placements; existing traffic may continue.
  • INACTIVE: Not eligible for routing.
Records are leased; Heartbeat renews the lease. Expired records should not be routed to.

DC-aware actor placement

Use SpawnOn with WithDataCenter to spawn an actor in a specific datacenter:
DC-aware actor placement
Placement: the target is one of the target DC’s DataCenterRecord.Endpoints, selected uniformly at random. Which node runs the actor depends on what that DC registered: if it registered all nodes’ remoting addresses, the actor is placed on a random node in that DC. The actor kind must be registered on the target DC’s actor systems; otherwise the remote node returns ErrTypeNotRegistered.

Messaging across DCs

Once an actor is spawned (locally or in another DC), messaging is location-transparent. Use Tell, Ask, Request as usual; the framework routes to the correct node. Grains can also be addressed by identity across DCs when multi-DC is enabled: the system uses the control plane’s cached active datacenter records and attempts delivery to the first endpoint that successfully handles the request.

Readiness and errors

  • system.DataCenterReady: Returns whether the multi-DC controller is operational.
  • system.DataCenterLastRefresh: Time of last successful DC cache refresh.
  • ErrDataCenterNotReady: Controller not ready; SpawnOn with WithDataCenter fails.
  • ErrDataCenterStaleRecords: Cache older than MaxCacheStaleness and FailOnStaleCache is true.
  • ErrDataCenterRecordNotFound: Target DC not in active records or not in ACTIVE state.

Custom control plane

Implement the datacenter.ControlPlane interface:
  • Register, Heartbeat, SetState, ListActive, Watch, Deregister
See datacenter/controlplane/nats and datacenter/controlplane/etcd as reference implementations. Wire it in by passing the control plane to the datacenter config when creating the actor system.

See also