Darlean is an advanced Virtual Actor framework with focus on productivity, flexibility, availability and scalability.
It is a Distributed Application Runtime (DAR) that makes the development of distributed scalable applications as straightforward as if they were regular, traditional and stateful applications.
It eliminates much of the overhead and complexity of developing, deploying and monitoring that is part of other popular DAR’s like AWS, Azure and Google Cloud.
It is inspired by Orleans and DAPR, but is more flexible in its deployment, can be used with any language that supports gRPC, does not require (but can work with) external services like DynamoDB or Zookeeper, can be extended without having to recompile the framework, has a strict separation between the very small core runtime and additional functionality like bindings and integrations, has a very powerful and flexible persistence model which allows it to natively provide functionality like S3, SQS, SNS and DynamoDB, and neatly integrates into your programming language.
Why?
Traditional stateful monolithic computer programs are by nature limited in their scalability and availability. In recent years, the stateless microservice way of programming (like AWS Lambda and Azure Functions) has become very popular because it mostly solves the challenges of scalability and availability. However, this comes at a price, the microservice premium, that is caused by the friction that results from trying to solve mostly stateful real-world problems with a stateless architecture. In order to work around the limitations that the stateless paradigm imposes, it is necessary to explore, select, configure, integrate, deploy and monitor all kinds of intermediate services like queues and datastores, which puts a significant burdon on the shoulders of the devops team, both in terms of effort and required knowledge.
Darlean combines the benefits of both stateful monolithic and stateless microservice paradigms by providing a state-aware actor-oriented approach to distributed, scalable applications. This is performed by splitting up the business logic into small pieces of code and state called actors. The framework determines on which application node an individual actor will be running (called actor placement), and can adjust actor placement at any moment without loss of data or disruption of availability. Scalability is achieved by adding more application nodes to the cluster and redistributing actors over available nodes. Availability is achieved by instantly moving actors from dead application nodes to alive ones.
How?
A Darlean cluster consists of one or more runtime nodes (the blue squares in the picture below) and one or more application nodes (the green squares and triangles). Nodes can be separate processes that run within an operating system in a virtual machine or bare metal, or they can be containerized and run in environments like Docker, Kubernetes or a fully managed container service like Fargate or Container Instances.
Multiple nodes that are written in the same language can even be combined into one process/container to simplify the development and deployment for smaller projects that have less demanding requirements regarding availability and scalability.
Actors (the little orange shapes) within a virtual actor framework are similar to objects in a traditional object oriented program. The major difference is that actors are not bound to one specific process. Their builtin persistence capabilities allows the runtime to seemlessly move them from one application node to the other. Should one process die, the actor magically pops up in another process, without loss of state!
As can be seen in the above picture, there are two types of application nodes: helper nodes (the green squares) and application nodes (the green triangles). They are very similar, the only difference is that the helper nodes are ready-made by Darlean, and that the application nodes are created by the application developer. The helper nodes contain a lot of useful functionality that can be used by custom nodes out of the box (like data storage, queues, tables, cluster time, integrations with cloud platforms, web servers, etcetera). The application nodes contain the application specific functionality.