You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Duplex remoting protocol (#1301, #1302). Nodes now speak a multiplexed remoting protocol with dedicated control, ordinary, and large-message lanes. Protocol negotiation falls back to the legacy unary path, and remote.WithProtocolPin pins the wire to auto, legacy, or duplex for mixed-version rollouts or homogeneous clusters.
Configurable lanes, chunking, and credit-based flow control. Lanes, deadlines, and frame limits are tunable. Large messages are chunked (default 256 KiB) and paced by a credit window (default 16 MiB). Existing actor APIs (Tell, Ask, and batches) are unchanged.
📬 Reliable delivery
Confirmed point-to-point delivery (#1296, #1300). Actors can opt into confirmed, ordered, flow-controlled delivery for a named producer–consumer pair, locally or across remoting. Delivery confirmations, retries, deduplication, chunking, durable queues, and cluster/remoting deployment options are included. Point-to-point delivery is effectively-once on the fault-free path.
Work-pulling delivery. Jobs can be distributed across a dynamic worker group with at-least-once semantics.
Consumer-driven flow control. The default window is 50 messages (maximum 10,000), with configurable retry and resend intervals. Default Tell semantics are unchanged; reliability applies only to flows you configure.
⚡ Performance
Local Tell and Ask scale across independent actor pairs (#1308). Process-wide bottlenecks on the messaging path are gone. On an 8-core Apple M1, pairwise Tell increased from 9.3M to 25M msg/s and Ask from 1.0M to 3.1M req/s. Single-pair Tell increased from 7.8M to approximately 12M msg/s; a 32-vCPU GCP instance reached 54–62M msg/s across pairwise workloads.
Sharded receive-context recycling. Contexts are recycled from per-actor pool shards instead of a process-wide channel, reducing contention and steady-state memory use.
Direct dispatcher handoff. Worker wake-ups no longer serialize on a shared condition variable.
Per-request Ask reply channels. Reply channels are no longer taken from a global pool, which removes channel-lock contention and the timeout-reuse hazard of a late reply landing in a recycled channel.
GrainOf and GrainIdentity skip the cluster registry for an already active local grain (#1307, #1309). Resolution matches the fast path TellGrain and AskGrain already use.
Grain messaging path (#1310). Grain contexts and TellGrain acknowledgment channels recycle from per-grain sharded pools. Grain turns stamp activity once per turn and coalesce passivation-manager updates, so the drain path no longer takes a shared mutex on every message. AskGrain replies, success and failure alike, travel on a single per-request reply channel; handler errors and panics are still returned to the caller. On an 8-core Apple M1, TellGrain against a single grain increased from 1.4M to 2.1M msg/s, fan-out across 256 grains doubled from 1.2M to 2.5M msg/s, and AskGrain increased from 1.0M to 1.27M req/s, landing within 10% of actor Ask.
Pairwise throughput and tail-latency benchmarks. The benchmark suite now covers independent actor pairs and grain pairs (GrainTellPairwise, GrainAskPairwise). At that scaling surface, grains match actor Ask throughput.
⚠️ Behavior Changes
Remote fire-and-forget reports enqueue success consistently on the duplex path. Transport failures are dead-lettered. Outbound congestion returns errors.ErrRemoteSendBackpressure after the configured deadline. Message ordering is preserved per sender–target pair.
TellGrain and AskGrain delivery semantics are unchanged.TellGrain still blocks until the grain has processed and acknowledged the message.
📚 Documentation
Updated the remoting documentation with the duplex protocol, lanes, chunking, credit-window, and send-semantics configuration.
Added contributor architecture documentation for reliable delivery.
Added user documentation for point-to-point and work-pulling reliable delivery.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
✨ Features
🌐 Multiplexed remoting
remote.WithProtocolPinpins the wire toauto,legacy, orduplexfor mixed-version rollouts or homogeneous clusters.256 KiB) and paced by a credit window (default16 MiB). Existing actor APIs (Tell,Ask, and batches) are unchanged.📬 Reliable delivery
50messages (maximum10,000), with configurable retry and resend intervals. DefaultTellsemantics are unchanged; reliability applies only to flows you configure.⚡ Performance
TellandAskscale across independent actor pairs (#1308). Process-wide bottlenecks on the messaging path are gone. On an 8-core Apple M1, pairwiseTellincreased from9.3Mto25Mmsg/s andAskfrom1.0Mto3.1Mreq/s. Single-pairTellincreased from7.8Mto approximately12Mmsg/s; a 32-vCPU GCP instance reached54–62Mmsg/s across pairwise workloads.Askreply channels. Reply channels are no longer taken from a global pool, which removes channel-lock contention and the timeout-reuse hazard of a late reply landing in a recycled channel.GrainOfandGrainIdentityskip the cluster registry for an already active local grain (#1307, #1309). Resolution matches the fast pathTellGrainandAskGrainalready use.TellGrainacknowledgment channels recycle from per-grain sharded pools. Grain turns stamp activity once per turn and coalesce passivation-manager updates, so the drain path no longer takes a shared mutex on every message.AskGrainreplies, success and failure alike, travel on a single per-request reply channel; handler errors and panics are still returned to the caller. On an 8-core Apple M1,TellGrainagainst a single grain increased from1.4Mto2.1Mmsg/s, fan-out across 256 grains doubled from1.2Mto2.5Mmsg/s, andAskGrainincreased from1.0Mto1.27Mreq/s, landing within10%of actorAsk.GrainTellPairwise,GrainAskPairwise). At that scaling surface, grains match actorAskthroughput.errors.ErrRemoteSendBackpressureafter the configured deadline. Message ordering is preserved per sender–target pair.TellGrainandAskGraindelivery semantics are unchanged.TellGrainstill blocks until the grain has processed and acknowledged the message.📚 Documentation
🔀 Pull Requests
Full Changelog: v4.4.3...v4.5.0
This discussion was created from the release v4.5.0.
All reactions