1.4.19 April 28 2021
Maintenance Release for Akka.NET 1.4
Akka.NET v1.4.19 is a substantial release that includes a number of critical Akka.Cluster fixes, baseline Akka.NET performance improvements, and entirely new dispatcher that has shown to improve performance when used across all of the major actor groups that run both inside the /user
hierarchy and the /system
actor hierarchy as well.
Akka.Cluster Improvements
One of the most demanding issues of the v1.4.19 release was "Akka.Cluster: quarantining / reachability changes appear to be extremely sensitive" - and this is because debugging this issue touched so many different parts of Akka.Cluster.
We ultimately solved the problem - it is now quite feasible to rapidly scale an Akka.NET cluster from ~10 nodes to 50+ nodes without having a huge number of quarantines, accidentally downed nodes, and so on.
Here's the full set of fixes that went into resolving this issue:
- Added
PhiAccrualFailureDetector
warning logging for slow heartbeats - measure Akka.Cluster heartbeat timings, hardened Akka.Cluster serialization
ClusterStressSpec
and Cluster Failure Detector Cleanup- Akka.Cluster: improve
HeartbeatNodeRing
performance - Akka.Cluster: Turned
HeatbeatNodeRing
intostruct
- Akka.Cluster: Configure duration for applying
MemberStatus.WeaklyUp
to joining nodes - Akka.Cluster: Performance optimize
VectorClock
- Akka.Cluster: Refactored
Gossip
intoMembershipState
- Akka.Remote: Clean up bad outbound ACKs in Akka.Remote
Akka.Cluster is now much more robust, faster, and capable of scaling up and down much more efficiently than in previous releases.
ChannelExecutor
and Akka Performance Improvements
In addition to improving Akka.Cluster, we also made substantial improvements to constructs found inside Akka.NET core itself:
- Perf optimize
ActorSelection
- 20% throughput improvement, 25% memory consumption improvement - fixed N-1 error inside
Mailbox
- Introduce
ChannelExecutor
In Akka.NET v1.4.19 we introduce an opt-in feature, the ChannelExecutor
- a new dispatcher type that re-uses the same configuration as a ForkJoinDispatcher
but runs entirely on top of the .NET ThreadPool
and is able to take advantage of dynamic thread pool scaling to size / resize workloads on the fly.
In order to get the most use out of the ChannelExecutor
, the default actor dispatcher, the internal dispatcher, and the Akka.Remote dispatchers all need to run on it - and you can see the latest configuration settings and guidance for that here in our documentation: https://getakka.net/articles/actors/dispatchers.html#channelexecutor
But a copy of today's configuration is included below - you can enable this feature inside your Akka.NET applications via the following HOCON:
akka.actor.default-dispatcher = {
executor = channel-executor
fork-join-executor { #channelexecutor will re-use these settings
parallelism-min = 2
parallelism-factor = 1
parallelism-max = 64
}
}
akka.actor.internal-dispatcher = {
executor = channel-executor
throughput = 5
fork-join-executor {
parallelism-min = 4
parallelism-factor = 1.0
parallelism-max = 64
}
}
akka.remote.default-remote-dispatcher {
type = Dispatcher
executor = channel-executor
fork-join-executor {
parallelism-min = 2
parallelism-factor = 0.5
parallelism-max = 16
}
}
akka.remote.backoff-remote-dispatcher {
executor = channel-executor
fork-join-executor {
parallelism-min = 2
parallelism-max = 2
}
}
We are looking for feedback on how well the ChannelExecutor
works in real world applications here: #4983
Hyperion v0.10 and Improvements
We also released Hyperion v0.10.0 and v0.10.1 as part of the Akka.NET v1.4.19 sprint, and this includes some useful changes for Akka.NET users who are trying to build cross-platform (.NET Framework + .NET Core / .NET 5) applications and need to handle all of the idiosyncrasies those platforms introduced by changing the default namespaces on primitive types such as string
and int
.
We have also introduced a new Setup
type designed to make it easy to resolve some of these "cross platform" serialization concerns programmatically when configuring Hyperion for use inside Akka.NET:
#if NETFRAMEWORK
var hyperionSetup = HyperionSerializerSetup.Empty
.WithPackageNameOverrides(new Func<string, string>[]
{
str => str.Contains("System.Private.CoreLib,%core%")
? str.Replace("System.Private.CoreLib,%core%", "mscorlib,%core%") : str
}
#elif NETCOREAPP
var hyperionSetup = HyperionSerializerSetup.Empty
.WithPackageNameOverrides(new Func<string, string>[]
{
str => str.Contains("mscorlib,%core%")
? str.Replace("mscorlib,%core%", "System.Private.CoreLib,%core%") : str
}
#endif
var bootstrap = BootstrapSetup.Create().And(hyperionSetup);
var system = ActorSystem.Create("actorSystem", bootstrap);
See the full documentation for this feature here: https://getakka.net/articles/networking/serialization.html#cross-platform-serialization-compatibility-in-hyperion
To see the full set of fixes in Akka.NET v1.4.19, please see the milestone on Github.
COMMITS | LOC+ | LOC- | AUTHOR |
---|---|---|---|
38 | 6092 | 4422 | Aaron Stannard |
13 | 2231 | 596 | Gregorius Soedharmo |
10 | 15 | 14 | dependabot-preview[bot] |
3 | 512 | 306 | zbynek001 |
3 | 417 | 1 | Ismael Hamed |
1 | 5 | 5 | Erik Følstad |
1 | 5 | 19 | Arjen Smits |
1 | 27 | 1 | Anton V. Ilyin |
1 | 21 | 33 | Igor |
1 | 1 | 1 | Cagatay YILDIZOGLU |
Changes:
- 7a34a14 v1.4.19 Akka.NET Release (#4987) [ #4860, #4862, #4875, #4866, #4874, #4889, #4880, #4891, #4893, #4892, #4896, #4894, #4890, #4898, #4900, #4897, #4902, #4901, #4909, #4911, #4912, #4913, #4914, #4916, #4917, #4918, #4920, #4923, #4927, #4096, #4928, #4925, #4930, #4933, #4924, #4934, #4935, #4922, #4939, #4940, #4938, #4942, #4945, #4943, #4947, #4946, #4949, #4950, #4952, #4954, #4944, #4878, #4958, #4959, #4960, #4957, #4961, #4962, #4955, #4966, #4964, #4963, #4969, #4895, #4972, #4968, #4974, #4910, #4975, #4976, #4978, #4980, #4882, #4984, #4985 ]
- a3feeef added v1.4.19 release notes (#4985)
- 82d7909 Upgrade to GitHub-native Dependabot (#4984)
- bdfc893 Introduce
ChannelExecutor
(#4882) - e58d36a Removed inaccurate warning from Cluster Singleton docs (#4980)
- a1fa221 Update PluginSpec so that it can accept ActorSystem and ActorSystemSetup in its constructor (#4978)
- 101f5a2 fixed racy ActorModelSpec (#4976)
- d178b63 clean up seed node process (#4975)
- 321d0e4 ORDictionary with POCO value missing items, add MultiNode spec (#4910)
- 442f8eb Fix serialization verification problem with Akka.IO messages (#4974)
See More
- 5251f36 Refactored
Gossip
intoMembershipState
(#4968) - 953fc0f simplified the environment variable name for StressSpec (#4972)
- 8c8c009 Add retry pattern with delay calculation support (#4895)
- 676f566 UnfoldResourceSource closing twice on failure (#4969)
- c4c6443 Clean up bad outbound ACKs in Akka.Remote (#4963)
- d06eb36 fixed N-1 error inside
Mailbox
(#4964) - 71a2a29 Fix
SpawnActor
benchmark (#4966) - a0da8cd
Reachability
performance optimziation (#4955) - 3f232d8 Perf optimize
ActorSelection
(#4962) - 8d03165 Bump Hyperion from 0.10.0 to 0.10.1 (#4957) [ #4961 ]
- 36585d8 added indicator for
ClusterResultsAggregator
inStressSpec
logs (#4960) - 696710e updated website footer to read 2021 (#4959)
- 31522d0 cleaned up
ReceiveActor
documentation (#4958) - 3c2f098 Add generalized crossplatform support for Hyperion serializer. (#4878)
- aed2cbc Turned
HeatbeatNodeRing
intostruct
(#4944) - 2de428b harden RestartFirstSeedNodeSpec (#4954)
- 1f81842 Performance optimize
VectorClock
(#4952) - 45bbd3b added
VectorClock
benchmark (#4950) - 1800e38 restored Akka.Cluster model-based FsCheck specs (#4949)
- 19f1580 Configure duration for applying
MemberStatus.WeaklyUp
to joining nodes (#4946) - 65e5a22 modified PingPong / RemotePingPong benchmarks to display threadcount (#4947)
- 234188e HeartbeatNodeRing performance (#4943)
- ac07a0f harden Akka.DependencyInjection.Tests (#4945)
- e0f8604 cleanup
AKKA_CLUSTER_ASSERT
environment variable (#4942) - 5e94772 Bump FsCheck.Xunit from 2.15.1 to 2.15.2 (#4938)
- 3ac3ee8 ClusterStressSpec and Cluster Failure Detector Cleanup (#4940)
- c87b627 Bump FsCheck from 2.15.1 to 2.15.2 (#4939)
- 87cc645 Add spec for handling delegates in DI (#4922)
- 56a787a Bump Hyperion from 0.9.17 to 0.10.0 (#4935)
- 97628d4 porting Cluster heartbeat timings, hardened Akka.Cluster serialization (#4934)
- fc5b043 Powershell splits CLI arguments on "." before passing them into applications (#4924)
- ef383bc Fix MNTK specs for DData: DurablePruningSpec (#4933)
- 950f824 cleaned up protobuf CLI and definitions (#4930)
- da88578 Add CLI switches to show help and version number (#4925)
- ee08dba close #4096 - documented how to terminate remembered entities (#4928)
- 56cae11 Bump Google.Protobuf from 3.15.7 to 3.15.8 (#4927)
- 1d144d7 Fix case where PersistenceMessageSerializer.FromBinary got a null for its type parameter (#4923)
- 5cc93ee Rewrite the AkkaDiFixture so that it does not need to start a HostBuilder (#4920)
- a800f8d Fixed System.ArgumentNullException in Interspase operation on empty stream finish. (#4918)
- 7f200f5 cleaned up RemoteWatcher (#4917)
- 9e6a94d [MNTR] Add include and exclude test filter feature (#4916)
- bb633b2 Bump Microsoft.Data.SQLite from 5.0.4 to 5.0.5 (#4914)
- a4b611d reduce allocations inside PhiAccrualFailureDetector (#4913)
- 85ef5d8 cleaned up the SpecPass / SpecFail messages (#4912)
- ec3fc61 added timestamp to node failures in MNTR (#4911)
- d3197dd fixed SBR logging error that blew up StandardOutLogger (#4909)
- e7b3fb2 replace reflection magic in MNTR with reading of
MultiNodeConfig
properties (#4902) [ #4901 ] - 4091508 Added PhiAccrualFailureDetector warning logging for slow heartbeats (#4897)
- 716d6f7 Bump Google.Protobuf from 3.15.6 to 3.15.7 (#4900)
- dc2c120 fixed up copyright headers (#4898)
- 88539cc Add Setup class for NewtonSoftJsonSerializer (#4890)
- ceefa28 Bump Microsoft.NET.Test.Sdk from 16.9.1 to 16.9.4 (#4894)
- 87ab5eb Added DoNotInherit annotation (#4896)
- 5610f95 Persistence fixes (#4892)
- d27df3d Handle CoordinatedShutdown exiting-completed when not joined (#4893)
- 651c391 Harden FileSink unit tests by using AwaitAssert to wait for file operations to complete (#4891)
- 6748e2a add CultureInfo for Turkish OS (#4880)
- f5cb089 Supress ActorSelectionMessage with DeadLetterSuppression (migrated from akka/akka#28341) (#4889)
- 411a1e0 Clean up Akka.Stream file stream (#4874)
- 637510b Merge pull request #4887 from IgorFedchenko/fix-racy-cluster-spec
- 71b1838 Fix ClusterMetricsExtensionSpec racy spec
- 8439b0b Bump Newtonsoft.Json from 12.0.3 to 13.0.1 (#4866)
- df199f6 Merge pull request #4875 from akkadotnet/dependabot/nuget/Hyperion-0.9.17
- b545365 close #4860 - use local deploy for TcpManager child actors. (#4862)
- 21762b9 Added v1.4.19 placeholder
This list of changes was auto generated.