Files
aether/.product-strategy/ISSUE_MIGRATION.md
Hugo Nijhuis b481dae0b6
All checks were successful
CI / build (push) Successful in 22s
feat: implement cross-node event broadcasting with NATSEventBus (#151)
This PR implements cross-node event broadcasting for aether.

Changes:
- UpdateVersionCache method in JetStreamEventStore
- SubscribeToEventStored helper in NATSEventBus
- Integration tests for cross-node scenarios
- Example code demonstrating NATSEventBus + JetStreamEventStore

Tests: All integration tests passing.
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Hugo Nijhuis <hugo.nijhuis@flowmade.one>
Reviewed-on: #151
2026-05-17 15:29:52 +00:00

2.5 KiB

Issue: Implement Actor Migration Between Cluster Nodes

Problem

When nodes join or leave the cluster, actors need to be migrated to maintain even distribution. Currently:

  • handleRebalanceRequest in cluster/manager.go:150 is empty
  • handleMigrationRequest in cluster/manager.go:167 is empty
  • RebalanceShards in cluster/shard.go:211 returns unchanged map
  • SendMessage in cluster/distributed.go:139 ignores sharding

Required Implementation

1. Rebalance Algorithm (cluster/shard.go)

Implement ConsistentHashPlacement.RebalanceShards to:

  • Calculate new shard assignments based on active nodes
  • Identify actors needing migration
  • Generate migration plan with source/dest nodes

2. Migration Coordinator (cluster/manager.go)

Implement handleRebalanceRequest to:

  • Accept migration plan from leader
  • For each actor in plan:
    1. Pause incoming messages
    2. Capture actor state (replay events up to current version)
    3. Serialize state
    4. Send migration request to destination node
    5. Wait for ack
    6. Delete actor from current node
  • Track migration status via ActorMigration.Status

3. Cross-Node Message Routing (cluster/distributed.go)

Implement proper routing in SendMessage:

  • Use GetActorNode(actorID) to determine target node
  • If remote: marshal message, send via NATS to target node
  • If local: send to local runtime
  • Route response back to caller if needed

Suggested Approach

  1. Define message types for actor migration requests/responses in cluster/types.go
  2. Implement state capture - replay events to get current state
  3. Implement state restore - deserialize and restore actor state
  4. Implement coordinator - manage migration phases
  5. Add error handling - handle failed migrations, retries, cleanup
  6. Add tests - test migration with mock NATS
  • cluster/manager.go:150 - handleRebalanceRequest (empty)
  • cluster/manager.go:167 - handleMigrationRequest (empty)
  • cluster/shard.go:211 - RebalanceShards (stub)
  • cluster/distributed.go:139 - SendMessage (simplified)
  • cluster/types.go:108 - ActorMigration struct

Acceptance Criteria

  • RebalanceShards returns new shard map with actor assignments
  • handleRebalanceRequest processes migration plan
  • handleMigrationRequest accepts actor migrations
  • SendMessage routes to correct node
  • Actors can be migrated with state preserved
  • Failed migrations are handled gracefully
  • Integration test with multi-node cluster