github akkadotnet/akka.net 1.4.19
Akka.NET v1.4.19

latest releases: 1.5.28, 1.5.28-beta1, 1.5.27.1...
3 years ago

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:

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:

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:

See More
  • 5251f36 Refactored Gossip into MembershipState (#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 in StressSpec 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 into struct (#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.

Don't miss a new akka.net release

NewReleases is sending notifications on new releases.