Akka 2.6 Is Coming: Type-Safety For Akka Actors, Improvements To Artery And Serialization
Akka 2.5.0 was released 2 years ago, and since then we have released 22 patch releases. This means that it's high time for a new minor release.
Akka 2.6.0 will be binary backwards compatible with 2.5.x. What we can do in minor releases compared to patch releases are things like change default configuration and remove deprecated features. We will typically also promote features that have been marked as "API may change".
No promises here, since it's hard to predict and the Lightbend Akka team also has other responsibilities, but we aim for having Akka 2.6.0 ready in September.
Stable APIs of Akka Typed
Akka Typed, which provides long-awaited type-safety for Akka Actors, was declared ready for production in Akka 2.5.22. The APIs of Akka Typed will be fully stable in Akka 2.6.0, and include things like:
- Improved documentation quality and completeness
- Improved test kits
- Some additional features, such as new API for Distributed PubSub
- Lightbend Telemetry instrumentation
- Updated Lightbend training courses
Akka 2.6 will also contain several important features to improve runtime stability.
Artery is the name for the new remote transport for actor messaging when using Akka Cluster. Artery comes in two flavors; one based on Akka Streams TCP/TLS and another based on Aeron. Artery is ready to be used in production, and in 2.6 we are making the Artery TCP transport the default for actor messaging in Akka.
Artery reduces the risk of head of line blocking and thereby improves stability for systems using Akka Cluster. It also has much better performance than the classic remoting functionality.
To reduce the risk of thread starvation, Akka 2.6 introduces a separate dispatcher for Akka internal tasks. That means that if the default dispatcher is accidentally starved because of mistakes in applications or libraries, the core of Akka will still continue to work, supporting for example Cluster heartbeating.
Akka 2.6 will also have a better default serializer. Java serialization comes with security problems, bad performance, and it's difficult to change classes in compatible ways. Java serialization is chosen by default for the application messages and persistent events. That's convenient when starting development but obviously not a good choice for production.
Jackson will probably be used. It will work out of the box for most classes, and it has an annotation based approach when more control or special cases are needed. In addition to text-based JSON, several binary formats are also supported by Jackson.
By propagating errors upstream in Akka Streams, we can have better error reporting and some of the race conditions that exist in Akka HTTP and other places can be solved. Currently when a stream fails, it is only seen as cancelation for upstream operators, and they don't see any difference between a failure and a successful completion of the stream. This isn’t supported by the Reactive Streams API, but within Akka Streams we can add this enhancement.
We need to remove outdated and replaced features to keep the API surface for end users clean, while also providing a maintenance footprint that we are able to manage.
Things that have been deprecated at least since Akka 2.5.0 will be removed, for example:
- Support for Scala 2.11.
- Akka Camel is superseded by Alpakka. Could become a community maintained module outside of Akka core if someone would be interested in taking ownership.
- Akka Agent
- ActorPublisher, ActorSubscriber in Streams. Replaced by GraphStage.
- UntypedActor, replaced by AbstractActor (Java API)
A few more things will be deprecated and removed earliest in 2.7.0, such as:
- Classic remoting, replaced by Artery
- Old TypedActor
- PersistentFSM, superseded by new Persistence APIs. Migration path will be investigated.
- Persistent mode of Cluster Sharding, superseded by DistributedData mode. Remember entities feature will be investigated.
- Cluster Client, superseded by Akka gRPC. Migration path will be investigated.
With this roadmap we anticipate exciting times ahead for the Akka project. Please reach out to us with feedback and opinions. You can follow the progress and see the full scope in the Akka 2.6 project board. Contributions to help with these tasks are very welcome. Please comment in GitHub issues or at akka/dev Gitter channel to get involved! Thanks for reading :)