Skip to content

Releases: Tochemey/goakt

v3.14.0

18 Feb 19:59
Immutable release. Only release title and notes can be modified.
3d02f49

Choose a tag to compare

🚀 Oveview

This release brings multi-datacenter support, a high-performance protobuf-over-TCP remoting stack, and important fixes for channel pooling, timeouts, and data races. It also adds an option to disable grain relocation and several allocation and lock optimizations across the hot paths.

✨ What's New

🌐 Multi-datacenter support

  • DC-transparent messaging — actors and grains can communicate across datacenters without changing your code.
  • Pluggable control plane — use NATS JetStream or Etcd for coordination.
  • DC-aware placement — spawn actors in a specific datacenter with SpawnOn and the WithDataCenter option.
  • See the datacenter package and WithDataCenter for details.

🛡️ Grain relocation control

  • WithGrainDisableRelocation — disable actor/grain relocation when you don’t need it (e.g. stateless actors or short-lived grains).

🐛 Bug Fixes

Area Fix
Shutdown preShutdown no longer builds or persists peer state when relocation is disabled (WithoutRelocation), so shutdown proceeds correctly and avoids unnecessary cluster work.
Channel pool Fixed channel-pool poisoning in GrainContext.NoErr(): sending on both response and error channels for sync calls could corrupt the pool under scheduling races.
Timeouts Fixed localSend timeout/cancel paths returning channels to the pool while the grain goroutine could still write, preventing stale values in later requests.
Data race Fixed race in PID.recordProcessedMessage() by replacing the runtime type assertion on passivationStrategy with an atomic.Bool set at init.

⚡ Performance & Remoting

🌐 New remoting stack (protobuf over TCP)

ConnectRPC/HTTP-based remoting is replaced with a protobuf-over-TCP server and connection-pooling client:

  • Multi-loop TCP accept with SO_REUSEPORT, TCP_FASTOPEN, and TCP_DEFER_ACCEPT for lower connection-setup latency and kernel-level load balancing.
  • Sharded WorkerPool for connection dispatch, reducing contention under high concurrency.
  • Length-prefixed wire protocol with dynamic protobuf type dispatch via the global registry (no per-service stubs or HTTP path routing).
  • FramePool with power-of-two bucketed sync.Pool (256 B – 4 MiB) for read buffers and frame slices to cut heap allocations and GC pressure.
  • LIFO connection pool in the TCP client with lazy stale-connection eviction and no background goroutines.
  • Pluggable ConnWrapper compression (Zstandard, Brotli, Gzip) on both client and server.

♻️ Pooling & allocation

  • Bounded channel-based pools instead of sync.Pool for ReceiveContext, GrainContext, and response/error channels on the Tell, Ask, SendAsync, and SendSync hot paths to avoid cross-P thrashing and madvise overhead.
  • PID.latestReceiveTimeNano switched from atomic.Time to atomic.Int64 (Unix nanoseconds) to remove ~24-byte interface allocations per message.
  • Cached Address.String() and GrainIdentity.String() to avoid repeated fmt.Sprintf on every message.
  • Mailbox nodes in UnboundedMailbox and grainMailbox use plain pointers instead of atomic.Pointer on enqueue/dequeue.
  • Inlined defer closures in Ask-path functions (PID.Ask, actor.Ask, handleRemoteAsk, grain localSend) to remove per-call closure allocations.

🔓 Locking & contention

  • ActorOf does local actor lookup before taking the system-wide RWMutex; SendAsync/SendSync bypass the PID.ActorSystem() getter lock, reducing read-lock acquisitions from three to one on the local path.
  • passivationManager.Touch coalesced via an atomic timestamp guard (lastPassivationTouch), so mutex contention drops from once-per-message to at most once per 100 ms.

📦 Upgrade notes

  • Remoting now uses the new TCP-based stack by default. No API changes are required for typical usage.
  • Use WithGrainDisableRelocation when you want to skip relocation for certain grains.
  • For multi-DC setups, use the datacenter package and WithDataCenter with SpawnOn.

🔗 Pull requests

Features & refactors

Dependencies & tooling


Full Changelog: v3.13.0...v3.14.0

v3.13.0

23 Jan 14:08
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

🚀 What's Changed

✨ Features

🐛 Bug Fixes

  • fix: enhance robustness of the relocation process by @Tochemey in #1071

⚡ Performance Improvements

  • perf(actor): refactor how node publishes its state before gracefully leaving by @Tochemey in #1079
  • perf: ⚡ refactor default logger to enhance performance by @Tochemey in #1080
  • perf: ⚡ refactor remoting to boost performance by @Tochemey in #1083

🔨 Refactoring

  • refactor: refactor the implementation of the cluster engine by @Tochemey in #1074

🧹 Maintenance & Dependency Updates

  • chore(deps): update Golang Docker tag to v1.25.5 by @renovate[bot] in #1059
  • chore(deps): update module github.com/bufbuild/buf to v1.62.1 by @renovate[bot] in #1075
  • chore(deps): update module github.com/bufbuild/buf to v1.63.0 by @renovate[bot] in #1081

Full Changelog:

v3.12.1

06 Jan 17:30
Immutable release. Only release title and notes can be modified.
d48d69b

Choose a tag to compare

What's Changed

✨ New Features

🛠 Refactors & Maintenance

📚 Documentation

Full Changelog: v3.12.0...v3.12.1 and https://github.com/Tochemey/goakt/blob/main/changelog.md#v3121---2026-06-01

v3.12.0

31 Dec 14:35
Immutable release. Only release title and notes can be modified.
e1c9270

Choose a tag to compare

🚀 Highlights

This release focuses on robustness, resilience, and developer experience, with significant improvements across clustering, grains, scheduling, and maintenance.

✨ New Features

  • ✨ Remoting calls for Grains Enables remote interactions with Grains for distributed workflows. (@Tochemey · #1027)
  • 🧪 Basic TestKit support for Grains Introduces foundational testing utilities to simplify Grain testing. (@Tochemey · #1033)
  • 🧭 Default supervisor configuration SpawnOn now uses the system-wide default supervisor strategy. A new option, WithDefaultSupervisor, has been added to explicitly configure it. (@Tochemey · #1018)

🐛 Bug Fixes

  • Grain activation revamp Prevents panics and duplicate activations during Grain lifecycle handling. (@Tochemey · #1023)
  • Recovery support for Grain de/activation Adds recovery capabilities to improve fault tolerance. (@Tochemey · #1030)
  • Actor count correctness Fixes mismatches as well as underflow and overflow issues in actor counts. (@Tochemey · #1035)
  • Scheduler reliability Fixes an issue where ScheduleOnce() did not always trigger as expected. (@majiayu000 · #1039)

♻️ Refactors & Improvements

  • Address implementation overhaul Revamps address handling and adds support for configuring a default supervisor. (@Tochemey · #1019)
  • Supervisor system overhaul (@Tochemey · #1018)
    • Supervisor logic has been moved into its own dedicated package: supervisor
    • Migrating existing code only requires replacing actor with supervisor Breaking Change
  • Improved relocation semantics (@Tochemey · #1018)
    • Ensures child actors are not relocated unintentionally during relocation
    • Adds support to relocate actors with their configured supervisor strategy
  • Restart behaviour revamp The Restart implementation now restarts the entire child family tree, ensuring consistent recovery semantics. (@Tochemey · #1018)
  • Cluster storage DB file creation Reimplements DB file creation logic for improved reliability. (@Tochemey · #1025)
  • Cluster singleton resilience Makes singleton spawning more robust in clustered environments. (@Tochemey · #1038)
  • Reduced shutdown log noise Avoids unnecessary log spam during actor system shutdown. (@Tochemey · #1032)
  • General code maintenance Internal refactors and cleanup for long-term maintainability. (@Tochemey · #1026)

🧹 Chores & Dependency Updates

  • Cluster engine dependency upgrade Keeps the cluster engine up to date. (@Tochemey · #1041)
  • Dependency maintenance Routine dependency updates and housekeeping. (@Tochemey · #1042)

🙌 New Contributors

Full Changelog: https://github.com/Tochemey/goakt/blob/main/changelog.md

v3.11.2

18 Dec 11:50
Immutable release. Only release title and notes can be modified.
7c44a4a

Choose a tag to compare

🧰 Maintenance

Full Changelog: v3.11.1...v3.11.2

v3.11.1

12 Dec 01:37
Immutable release. Only release title and notes can be modified.
9e5369b

Choose a tag to compare

🚀 Highlights

  • ⚡ Refactor the implementation of Kill method to take into consideration cluster mode.

🔗 Pull Requests

Full Changelog: v3.11.0...v3.11.1

v3.11.0

08 Dec 21:25
Immutable release. Only release title and notes can be modified.
048b17c

Choose a tag to compare

✨ What’s Changed

🚀 Features

  • ✨ Add cross-nodes context propagator to remoting by @Tochemey in #996. The documentation can be found here

📦 Dependency Updates

  • ⬆️ Update actions/checkout to v5.0.1 by @renovate[bot] in #992
  • 🧹 Update golangci/golangci-lint to v2.6.2 by @renovate[bot] in #993
  • 📦 Update github.com/bufbuild/buf to v1.60.0 by @renovate[bot] in #994

Full Changelog: v3.10.0...v3.10.1

v3.10.0

02 Dec 21:42
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

🚀 Highlights

  • ✨ Metrics instrumentation via OpenTelemetry
  • ⚡ Code refactoring to improve efficiency
  • 🐛 ActorRefs regression bug fix

Pull Requests

Full Changelog: v3.9.9...v3.10.0

v3.9.9

22 Nov 10:31
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

✨ What's Changed

  • ⚡ Refactor grain/pid to reduce memory footprint, improving overall efficiency by @Tochemey in #978
  • 📦 Update golangci/golangci-lint to v2.6.1 to keep static analysis up to date by @renovate[bot] in #979
  • 🔐 Upgrade dependencies and address reported vulnerability issues by @Tochemey in #980

Full Changelog: v3.9.8...v3.9.9

v3.9.8

14 Nov 17:33
Immutable release. Only release title and notes can be modified.
eff8ff4

Choose a tag to compare

🚀 Highlights

  • Grains and Actor activation/placement strategies in cluster mode
  • Refactor the implementation of ActorRefs to return error to make it more predictive.
  • Refresh tooling and dependencies upgrade.
  • Add a miscellaneous package to support local end-to-end testing workflows when fixing bugs.

What’s Changed

✨ Features

  • Add a miscellaneous package to support local end-to-end (e2e) testing workflows
    (#972 by @Tochemey)

⚡ Improvements & Refactors

  • Return a clear error when listing actors across nodes fails, improving debuggability in distributed scenarios
    (#970 by @Tochemey)
  • Rewrite the logic for round-robin and least-load strategies to make routing behavior more predictable and maintainable
    (#974 by @Tochemey)

📦 Dependency & CI Updates

  • ⬆️ Bump actions/upload-artifact GitHub Action to v5 for more reliable artifact handling in CI
    (#969 by @renovate[bot])
  • ⬆️ Update golangci/golangci-lint to v2.6.0 to pick up the latest linting rules and fixes
    (#971 by @renovate[bot])

⚠️ Notes

  • No breaking changes are expected.
  • If you rely on cross-node actor listing, you may now see explicit errors where silent failures previously occurred—check logs and error handling paths accordingly.

🔗 Pull Requests

  • chore(deps): update actions/upload-artifact action to v5 by @renovate[bot] in #969
  • refactor: return an error when listing actors across nodes by @Tochemey in #970
  • feat: ✨ miscellaneous package for local e2e by @Tochemey in #972
  • chore(deps): update dependency golangci/golangci-lint to v2.6.0 by @renovate[bot] in #971
  • refactor: rewrite the logic round-robin and least-load strategies by @Tochemey in #974

Full Changelog: v3.9.7...v3.9.8