Releases: Tochemey/goakt
v3.14.0
🚀 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
SpawnOnand theWithDataCenteroption. - See the
datacenterpackage andWithDataCenterfor 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, andTCP_DEFER_ACCEPTfor lower connection-setup latency and kernel-level load balancing. - Sharded
WorkerPoolfor 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).
FramePoolwith power-of-two bucketedsync.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
ConnWrappercompression (Zstandard, Brotli, Gzip) on both client and server.
♻️ Pooling & allocation
- Bounded channel-based pools instead of
sync.PoolforReceiveContext,GrainContext, and response/error channels on theTell,Ask,SendAsync, andSendSynchot paths to avoid cross-P thrashing and madvise overhead. PID.latestReceiveTimeNanoswitched fromatomic.Timetoatomic.Int64(Unix nanoseconds) to remove ~24-byte interface allocations per message.- Cached
Address.String()andGrainIdentity.String()to avoid repeatedfmt.Sprintfon every message. - Mailbox nodes in
UnboundedMailboxandgrainMailboxuse plain pointers instead ofatomic.Pointeron enqueue/dequeue. - Inlined
deferclosures in Ask-path functions (PID.Ask,actor.Ask,handleRemoteAsk, grainlocalSend) to remove per-call closure allocations.
🔓 Locking & contention
ActorOfdoes local actor lookup before taking the system-wideRWMutex;SendAsync/SendSyncbypass thePID.ActorSystem()getter lock, reducing read-lock acquisitions from three to one on the local path.passivationManager.Touchcoalesced 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
WithGrainDisableRelocationwhen you want to skip relocation for certain grains. - For multi-DC setups, use the
datacenterpackage andWithDataCenterwithSpawnOn.
🔗 Pull requests
Features & refactors
- ✨ Multi-datacenter capabilities — @Tochemey in #1085
- 🔄 Datacenter implementation refactor — @Tochemey in #1092
- ⚡ Performance optimisations — @Tochemey in #1094
- 📚 Comprehensive documentation — @Tochemey in #1096
Dependencies & tooling
- chore(deps):
github.com/zeebo/xxh3→ v1.1.0 — @renovate[bot] in #1088 - chore(deps):
actions/checkout→ v6.0.2 — @renovate[bot] in #1086 - chore(deps):
golangci/golangci-lint→ v2.8.0 — @renovate[bot] in #1087 - chore(deps):
github.com/redis/go-redis/v9→ v9.17.3 — @renovate[bot] in #1089 - chore(deps):
github.com/bufbuild/buf→ v1.64.0 — @renovate[bot] in #1091 - chore(deps): Go → v1.25.6 — @renovate[bot] in #1090
- chore(deps):
github.com/klauspost/compress→ v1.18.4 — @renovate[bot] in #1093 - chore(deps):
github.com/bufbuild/buf→ v1.65.0 — @renovate[bot] in #1098
Full Changelog: v3.13.0...v3.14.0
v3.13.0
🚀 What's Changed
✨ Features
- feat: added utility methods by @Tochemey in #1060
- feat(actor): ✨ reject user messages during system shutdown by @Tochemey in #1073
🐛 Bug Fixes
⚡ 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
🧹 Maintenance & Dependency Updates
- chore(deps): update Golang Docker tag to
v1.25.5by @renovate[bot] in #1059 - chore(deps): update module
github.com/bufbuild/buftov1.62.1by @renovate[bot] in #1075 - chore(deps): update module
github.com/bufbuild/buftov1.63.0by @renovate[bot] in #1081
Full Changelog:
v3.12.1
What's Changed
✨ New Features
- actor: Added reentrancy capabilities by @Tochemey in #1050
- grain: Added bounded mailbox support for grains by @Tochemey in #1055. This feature was engineered by @andreas-lindfalk
🛠 Refactors & Maintenance
- actor: Refactored the reentrancy implementation by @Tochemey in #1052
- core: General code maintenance and cleanup by @Tochemey in #1053
📚 Documentation
- Updated copyright headers by @Tochemey in #1049
- Documented reentrancy in the feature list by @Tochemey in #1051
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
🚀 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
SpawnOnnow 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
actorwithsupervisorBreaking Change
- Supervisor logic has been moved into its own dedicated package:
- 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
Restartimplementation 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
- @majiayu000 made their first contribution in #1039
- @TrueBrain made significant contribution in enhancing the cluster engine in #1036
Full Changelog: https://github.com/Tochemey/goakt/blob/main/changelog.md
v3.11.2
🧰 Maintenance
- refactor: code maintenance by @Tochemey in #1006
- chore: maintenance by @Tochemey in #1008
- chore: upgrade dependencies by @Tochemey in #1010
- chore(deps): update actions/checkout action by @renovate[bot] in #1012
- chore(deps): update golangci/golangci-lint-action action to v9 by @renovate[bot] in #1013
- chore(deps): ⬆️ dependencies upgrade by @Tochemey in #1015
Full Changelog: v3.11.1...v3.11.2
v3.11.1
🚀 Highlights
- ⚡ Refactor the implementation of
Killmethod to take into consideration cluster mode.
🔗 Pull Requests
- chore(deps): update actions/checkout action to v6 by @renovate[bot] in #999
- docs: enhance readme by @Tochemey in #1001
- refactor: refactor the implementation of kill by @Tochemey in #1004
Full Changelog: v3.11.0...v3.11.1
v3.11.0
✨ 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/checkouttov5.0.1by @renovate[bot] in #992 - 🧹 Update
golangci/golangci-linttov2.6.2by @renovate[bot] in #993 - 📦 Update
github.com/bufbuild/buftov1.60.0by @renovate[bot] in #994
Full Changelog: v3.10.0...v3.10.1
v3.10.0
🚀 Highlights
- ✨ Metrics instrumentation via OpenTelemetry
- ⚡ Code refactoring to improve efficiency
- 🐛
ActorRefsregression bug fix
Pull Requests
- Add metrics OpenTelemetry-based instrumentation by @Tochemey in #988
- Refactor implementation to improve efficiency by @Tochemey in #983
- Fix
ActorRefsparsing issue by @Tochemey in #990
Full Changelog: v3.9.9...v3.10.0
v3.9.9
✨ What's Changed
- ⚡ Refactor
grain/pidto reduce memory footprint, improving overall efficiency by @Tochemey in #978 - 📦 Update
golangci/golangci-linttov2.6.1to 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
🚀 Highlights
- Grains and Actor activation/placement strategies in cluster mode
- Refactor the implementation of
ActorRefsto 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
⚡ 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-artifactGitHub Action tov5for more reliable artifact handling in CI
(#969 by @renovate[bot]) - ⬆️ Update
golangci/golangci-linttov2.6.0to 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