From bde0b11d44373e12c024c4e40c49d34990a653f8 Mon Sep 17 00:00:00 2001 From: Shalabh Mohan Shrivastava Date: Thu, 3 Oct 2019 14:22:29 -0700 Subject: [PATCH 1/4] Enhancing Actor Docs and Adding Actor Concepts Adding actor concepts and enhancing the existing docs --- concepts/actor/actor_overview.md | 69 ++++++++++++++++ concepts/actor/actors_features.md | 118 +++++++++++++++++++++++++++ concepts/actor/actors_integration.md | 2 +- 3 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 concepts/actor/actor_overview.md create mode 100644 concepts/actor/actors_features.md diff --git a/concepts/actor/actor_overview.md b/concepts/actor/actor_overview.md new file mode 100644 index 00000000000..2654506f7cd --- /dev/null +++ b/concepts/actor/actor_overview.md @@ -0,0 +1,69 @@ +# Introduction to Actors +Actors is an application pattern based on the Virtual Actor pattern. +Dapr programming model enables writing the actor pattern. The Actors API provides a single-threaded programming model built on the scalability and reliability guarantees. + +## What are Actors? + +An actor is an isolated, independent unit of compute and state with single-threaded execution. + +The [actor pattern](https://en.wikipedia.org/wiki/Actor_model) is a computational model for concurrent or distributed systems in which a large number of these actors can execute simultaneously and independently of each other. Actors can communicate with each other and they can create more actors. + +### When to use Actors + +Dapr Actors is an implementation of the actor design pattern. As with any software design pattern, the decision whether to use a specific pattern is made based on whether or not a software design problem fits the pattern. + +Although the actor design pattern can be a good fit to a number of distributed systems problems and scenarios, careful consideration of the constraints of the pattern and the framework implementing it must be made. As general guidance, consider the actor pattern to model your problem or scenario if: + +* Your problem space involves a large number (thousands or more) of small, independent, and isolated units of state and logic. +* You want to work with single-threaded objects that do not require significant interaction from external components, including querying state across a set of actors. +* Your actor instances won't block callers with unpredictable delays by issuing I/O operations. + +# Actors in Dapr + +Every actor is defined as an instance of an actor type, identical to the way a .NET object is an instance of a .NET type. For example, there may be an actor type that implements the functionality of a calculator and there could be many actors of that type that are distributed on various nodes across a cluster. Each such actor is uniquely identified by an actor ID. + +# Actor Lifetime + +Dapr actors are virtual, meaning that their lifetime is not tied to their in-memory representation. As a result, they do not need to be explicitly created or destroyed. The Dapr Actors runtime automatically activates an actor the first time it receives a request for that actor ID. If an actor is not used for a period of time, the Dapr Actors runtime garbage-collects the in-memory object. It will also maintain knowledge of the actor's existence should it need to be reactivated later. For more details, see Actor lifecycle and garbage collection. + +This virtual actor lifetime abstraction carries some caveats as a result of the virtual actor model, and in fact the Reliable Actors implementation deviates at times from this model. + +An actor is automatically activated (causing an actor object to be constructed) the first time a message is sent to its actor ID. After some period of time, the actor object is garbage collected. In the future, using the actor ID again, causes a new actor object to be constructed. An actor's state outlives the object's lifetime when storing the state in Dapr. + +# Distribution and failover +To provide scalability and reliability, actors instances are distributed throughout the cluster and automatically migrates them from failed nodes to healthy ones as required. + +Actors are distributed across the pods of the Actor Service, and those pods are distributed across the nodes in a cluster. Each service partition contains a set of actors + +The Dapr Actor runtime manages distribution scheme and key range settings for you. This simplifies some choices but also carries some consideration: + +* Dapr Actors is using the range partitioning scheme. +* By default, actors are randomly placed into pods resulting in uniform distribution. +* Because actors are randomly placed, it should be expected that actor operations will always require network communication, including serialization and deserialization of method call data, incurring latency and overhead. + +# Actor communication + +You can interact with Dapr to invoke the actor method by calling Http/gRPC endpoint + +``` +POST/GET/PUT/DELETE http://localhost:3500/v1.0/actors///method/ +``` + +If you want to pass the method parameters, then you can pass in request body. + +Refer [dapr spec](/dapr/spec/blob/master/actors.md) for more details. + +Since Method invocations and their responses ultimately result in network requests across the cluster, so the arguments and the result types of the tasks that they return must be serializable. + +### Concurrency + +The Dapr Actors runtime provides a simple turn-based access model for accessing actor methods. This means that no more than one thread can be active inside an actor object's code at any time. Turn-based access greatly simplifies concurrent systems as there is no need for synchronization mechanisms for data access. It also means systems must be designed with special considerations for the single-threaded access nature of each actor instance. + +A single actor instance cannot process more than one request at a time. An actor instance can cause a throughput bottleneck if it is expected to handle concurrent requests. + +Actors can deadlock on each other if there is a circular request between two actors while an external request is made to one of the actors simultaneously. The Dapr actor runtime will automatically time out on actor calls and throw an exception to the caller to interrupt possible deadlock situations. + +### Turn-based access +A turn consists of the complete execution of an actor method in response to a request from other actors or clients, or the complete execution of a timer/reminder callback. Even though these methods and callbacks are asynchronous, the Dapr Actors runtime does not interleave them. A turn must be fully finished before a new turn is allowed. In other words, an actor method or timer/reminder callback that is currently executing must be fully finished before a new call to a method or callback is allowed. A method or callback is considered to have finished if the execution has returned from the method or callback and the task returned by the method or callback has finished. It is worth emphasizing that turn-based concurrency is respected even across different methods, timers, and callbacks. + +The Dapr Actors runtime enforces turn-based concurrency by acquiring a per-actor lock at the beginning of a turn and releasing the lock at the end of the turn. Thus, turn-based concurrency is enforced on a per-actor basis and not across actors. Actor methods and timer/reminder callbacks can execute simultaneously on behalf of different actors. \ No newline at end of file diff --git a/concepts/actor/actors_features.md b/concepts/actor/actors_features.md new file mode 100644 index 00000000000..ab4264d3142 --- /dev/null +++ b/concepts/actor/actors_features.md @@ -0,0 +1,118 @@ +# Dapr Actors Runtime + +Dapr Actors runtime provides capability to use Actor pattern features. + +## Actor State Management + Actors are single-threaded objects that can encapsulate both logic and state. Because Dapr provides the state management, so Actors can maintain state reliably by using the same persistence and replication mechanisms. This way, actors don't lose their state after failures, upon reactivation after garbage collection, or when they are moved around between pods in a cluster due to resource balancing or upgrades. + + You can interact with Dapr Actors runtime through Http/gRPC endpoints for state management. + + ### Save the Actor State + +You can save the Actor state of a given key of actorId of type actorType by calling + +``` +POST/PUT http://localhost:3500/v1.0/actors///state/ +``` + +Value of the key is passed as request body. + +``` +{ + "key": "value" +} +``` + +If you want to save multiple items in a single transaction, you can call + +``` +POST/PUT http://localhost:3500/v1.0/actors///state +``` + +### Retrieve the Actor State + +Once you have saved the actor state, you can retrived the saved state by calling + +``` +GET http://localhost:3500/v1.0/actors///state/ +``` + +### Remove the Actor State + +You can remove state permanently from the saved Actor state by calling + +``` +DELETE http://localhost:3500/v1.0/actors///state/ +``` + +Refer [dapr spec](/dapr/spec/blob/master/actors.md) for more details. + +## Actor Timers and Reminders +Actors can schedule periodic work on themselves by registering either timers or reminders. + +### Actor timers + +You can register a callback on actor to be executed based on +timer. + +Dapr Actor runtime ensures that the callback methods respect the turn-based concurrency guarantees.This means that no other actor methods or timer/reminder callbacks will be in progress until this callback completes execution. + +The next period of the timer starts after the callback completes execution. This implies that the timer is stopped while the callback is executing and is started when the callback finishes. + +The Dapr Actors runtime saves changes made to the actor's state when the callback finishes. If an error occurs in saving the state, that actor object will be deactivated and a new instance will be activated. + +All timers are stopped when the actor is deactivated as part of garbage collection. No timer callbacks are invoked after that. Also, the Dapr Actors runtime does not retain any information about the timers that were running before deactivation. It is up to the actor to register any timers that it needs when it is reactivated in the future. + +You can create a timer for an actor by calling the Http/gRPC request to Darp. + +``` +POST,PUT http://localhost:3500/v1.0/actors///timers/ +``` + +You can provide the timer due time and callback in the request body. + +You can remove the actor timer by calling + +``` +DELETE http://localhost:3500/v1.0/actors///timers/ +``` + +Refer [dapr spec](/dapr/spec/blob/master/actors.md) for more details. + +### Actor reminders + +Reminders are a mechanism to trigger persistent callbacks on an actor at specified times. Their functionality is similar to timers. But unlike timers, reminders are triggered under all circumstances until the actor explicitly unregisters them or the actor is explicitly deleted. Specifically, reminders are triggered across actor deactivations and failovers because the Dapr Actors runtime persists information about the actor's reminders using Dapr actor state provider. + +You can create a persistent reminder for an actor by calling the Http/gRPC request to Darp. + +``` +POST,PUT POST,PUT http://localhost:3500/v1.0/actors///reminders/ +``` + +You can provide the reminder due time and period in the request body. + +#### Retrieve Actor Reminder + +You can retrieve the actor reminder by calling + +``` +GET http://localhost:3500/v1.0/actors///reminders/ +``` + +#### Remove the Actor Reminder + +You can remove the actor reminder by calling + +``` +DELETE http://localhost:3500/v1.0/actors///reminders/ +``` + +Refer [dapr spec](/dapr/spec/blob/master/actors.md) for more details. + + + + + + + + diff --git a/concepts/actor/actors_integration.md b/concepts/actor/actors_integration.md index 58b5ad53e56..4b5c7e87595 100644 --- a/concepts/actor/actors_integration.md +++ b/concepts/actor/actors_integration.md @@ -31,7 +31,7 @@ The following diagram illustrates two possible execution paths. ![Actors server] At a high level, the Actor API shall contain the following methods: * Dispatch to Actor when possible -* Call method on an Actor now +* Call method on an Actor * Load/save state * Create/remove * Locate & send message to an Actor From 790306e64731c5f31fd5bc74cd2ad18937db83f3 Mon Sep 17 00:00:00 2001 From: Shalabh Mohan Shrivastava Date: Thu, 3 Oct 2019 15:43:32 -0700 Subject: [PATCH 2/4] Resolving code review comments. --- concepts/actor/actor_overview.md | 25 ++++++++++++++----------- images/actors_communication.png | Bin 0 -> 32149 bytes images/actors_concurrency.png | Bin 0 -> 66656 bytes 3 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 images/actors_communication.png create mode 100644 images/actors_concurrency.png diff --git a/concepts/actor/actor_overview.md b/concepts/actor/actor_overview.md index 2654506f7cd..cce0ba9b5e3 100644 --- a/concepts/actor/actor_overview.md +++ b/concepts/actor/actor_overview.md @@ -1,6 +1,6 @@ # Introduction to Actors -Actors is an application pattern based on the Virtual Actor pattern. -Dapr programming model enables writing the actor pattern. The Actors API provides a single-threaded programming model built on the scalability and reliability guarantees. + +Dapr runtime provides an actor implementation which is based on Virtual Actor pattern. The Dapr Actors API provides a single-threaded programming model leveraging the scalability and reliability guarantees provided by underlying platform on which Dapr is running. ## What are Actors? @@ -20,24 +20,23 @@ Although the actor design pattern can be a good fit to a number of distributed s # Actors in Dapr -Every actor is defined as an instance of an actor type, identical to the way a .NET object is an instance of a .NET type. For example, there may be an actor type that implements the functionality of a calculator and there could be many actors of that type that are distributed on various nodes across a cluster. Each such actor is uniquely identified by an actor ID. +Every actor is defined as an instance of an actor type, identical to the way an object is an instance of a class. For example, there may be an actor type that implements the functionality of a calculator and there could be many actors of that type that are distributed on various nodes across a cluster. Each such actor is uniquely identified by an actor ID. # Actor Lifetime Dapr actors are virtual, meaning that their lifetime is not tied to their in-memory representation. As a result, they do not need to be explicitly created or destroyed. The Dapr Actors runtime automatically activates an actor the first time it receives a request for that actor ID. If an actor is not used for a period of time, the Dapr Actors runtime garbage-collects the in-memory object. It will also maintain knowledge of the actor's existence should it need to be reactivated later. For more details, see Actor lifecycle and garbage collection. -This virtual actor lifetime abstraction carries some caveats as a result of the virtual actor model, and in fact the Reliable Actors implementation deviates at times from this model. +This virtual actor lifetime abstraction carries some caveats as a result of the virtual actor model, and in fact the Dapr Actors implementation deviates at times from this model. -An actor is automatically activated (causing an actor object to be constructed) the first time a message is sent to its actor ID. After some period of time, the actor object is garbage collected. In the future, using the actor ID again, causes a new actor object to be constructed. An actor's state outlives the object's lifetime when storing the state in Dapr. +An actor is automatically activated (causing an actor object to be constructed) the first time a message is sent to its actor ID. After some period of time, the actor object is garbage collected. In the future, using the actor ID again, causes a new actor object to be constructed. An actor's state outlives the object's lifetime as state is stored in configured state provider for Dapr runtime. # Distribution and failover To provide scalability and reliability, actors instances are distributed throughout the cluster and automatically migrates them from failed nodes to healthy ones as required. -Actors are distributed across the pods of the Actor Service, and those pods are distributed across the nodes in a cluster. Each service partition contains a set of actors +Actors are distributed across the pods of the Actor Service, and those pods are distributed across the nodes in a cluster. Each service instance contains a set of actors. The Dapr Actor runtime manages distribution scheme and key range settings for you. This simplifies some choices but also carries some consideration: -* Dapr Actors is using the range partitioning scheme. * By default, actors are randomly placed into pods resulting in uniform distribution. * Because actors are randomly placed, it should be expected that actor operations will always require network communication, including serialization and deserialization of method call data, incurring latency and overhead. @@ -49,12 +48,10 @@ You can interact with Dapr to invoke the actor method by calling Http/gRPC endpo POST/GET/PUT/DELETE http://localhost:3500/v1.0/actors///method/ ``` -If you want to pass the method parameters, then you can pass in request body. +You can provide any data for actor method in the request body and response for the request would be in response body which is data from actor call. Refer [dapr spec](/dapr/spec/blob/master/actors.md) for more details. -Since Method invocations and their responses ultimately result in network requests across the cluster, so the arguments and the result types of the tasks that they return must be serializable. - ### Concurrency The Dapr Actors runtime provides a simple turn-based access model for accessing actor methods. This means that no more than one thread can be active inside an actor object's code at any time. Turn-based access greatly simplifies concurrent systems as there is no need for synchronization mechanisms for data access. It also means systems must be designed with special considerations for the single-threaded access nature of each actor instance. @@ -63,7 +60,13 @@ A single actor instance cannot process more than one request at a time. An actor Actors can deadlock on each other if there is a circular request between two actors while an external request is made to one of the actors simultaneously. The Dapr actor runtime will automatically time out on actor calls and throw an exception to the caller to interrupt possible deadlock situations. +![](../../images/actors_communication.png) + ### Turn-based access A turn consists of the complete execution of an actor method in response to a request from other actors or clients, or the complete execution of a timer/reminder callback. Even though these methods and callbacks are asynchronous, the Dapr Actors runtime does not interleave them. A turn must be fully finished before a new turn is allowed. In other words, an actor method or timer/reminder callback that is currently executing must be fully finished before a new call to a method or callback is allowed. A method or callback is considered to have finished if the execution has returned from the method or callback and the task returned by the method or callback has finished. It is worth emphasizing that turn-based concurrency is respected even across different methods, timers, and callbacks. -The Dapr Actors runtime enforces turn-based concurrency by acquiring a per-actor lock at the beginning of a turn and releasing the lock at the end of the turn. Thus, turn-based concurrency is enforced on a per-actor basis and not across actors. Actor methods and timer/reminder callbacks can execute simultaneously on behalf of different actors. \ No newline at end of file +The Dapr Actors runtime enforces turn-based concurrency by acquiring a per-actor lock at the beginning of a turn and releasing the lock at the end of the turn. Thus, turn-based concurrency is enforced on a per-actor basis and not across actors. Actor methods and timer/reminder callbacks can execute simultaneously on behalf of different actors. + +The following example illustrates the above concepts. Consider an actor type that implements two asynchronous methods (say, Method1 and Method2), a timer, and a reminder. The diagram below shows an example of a timeline for the execution of these methods and callbacks on behalf of two actors (ActorId1 and ActorId2) that belong to this actor type. + +![](../../images/actors_concurrency.png) \ No newline at end of file diff --git a/images/actors_communication.png b/images/actors_communication.png new file mode 100644 index 0000000000000000000000000000000000000000..e93ba1b67f1a71079aebce7c412860fabb143974 GIT binary patch literal 32149 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

|0bNryHCgYS{p~v-ZRKC=K@#8N&&d&0nOh9( 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 literal 0 HcmV?d00001 From d03b40d9dc186587382b4eab6b4495e4c2e75774 Mon Sep 17 00:00:00 2001 From: Shalabh Mohan Shrivastava Date: Thu, 3 Oct 2019 15:52:53 -0700 Subject: [PATCH 3/4] Updating the indentation --- concepts/actor/actor_overview.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/concepts/actor/actor_overview.md b/concepts/actor/actor_overview.md index cce0ba9b5e3..5c795de2279 100644 --- a/concepts/actor/actor_overview.md +++ b/concepts/actor/actor_overview.md @@ -18,11 +18,11 @@ Although the actor design pattern can be a good fit to a number of distributed s * You want to work with single-threaded objects that do not require significant interaction from external components, including querying state across a set of actors. * Your actor instances won't block callers with unpredictable delays by issuing I/O operations. -# Actors in Dapr +## Actors in Dapr Every actor is defined as an instance of an actor type, identical to the way an object is an instance of a class. For example, there may be an actor type that implements the functionality of a calculator and there could be many actors of that type that are distributed on various nodes across a cluster. Each such actor is uniquely identified by an actor ID. -# Actor Lifetime +## Actor Lifetime Dapr actors are virtual, meaning that their lifetime is not tied to their in-memory representation. As a result, they do not need to be explicitly created or destroyed. The Dapr Actors runtime automatically activates an actor the first time it receives a request for that actor ID. If an actor is not used for a period of time, the Dapr Actors runtime garbage-collects the in-memory object. It will also maintain knowledge of the actor's existence should it need to be reactivated later. For more details, see Actor lifecycle and garbage collection. @@ -30,7 +30,7 @@ This virtual actor lifetime abstraction carries some caveats as a result of the An actor is automatically activated (causing an actor object to be constructed) the first time a message is sent to its actor ID. After some period of time, the actor object is garbage collected. In the future, using the actor ID again, causes a new actor object to be constructed. An actor's state outlives the object's lifetime as state is stored in configured state provider for Dapr runtime. -# Distribution and failover +## Distribution and failover To provide scalability and reliability, actors instances are distributed throughout the cluster and automatically migrates them from failed nodes to healthy ones as required. Actors are distributed across the pods of the Actor Service, and those pods are distributed across the nodes in a cluster. Each service instance contains a set of actors. @@ -40,7 +40,7 @@ The Dapr Actor runtime manages distribution scheme and key range settings for yo * By default, actors are randomly placed into pods resulting in uniform distribution. * Because actors are randomly placed, it should be expected that actor operations will always require network communication, including serialization and deserialization of method call data, incurring latency and overhead. -# Actor communication +## Actor communication You can interact with Dapr to invoke the actor method by calling Http/gRPC endpoint From 98d12b3a3a9cc24069a93fd63a7ae9c6a8b5389e Mon Sep 17 00:00:00 2001 From: shalabhs Date: Fri, 4 Oct 2019 12:15:11 -0700 Subject: [PATCH 4/4] Resolving code review comments. --- concepts/actor/actor_pattern.md | 65 ---------------------- concepts/actor/actors_features.md | 6 +- concepts/actor/actors_integration.md | 41 -------------- concepts/actor/enable_actor_pattern.md | 76 -------------------------- 4 files changed, 3 insertions(+), 185 deletions(-) delete mode 100644 concepts/actor/actor_pattern.md delete mode 100644 concepts/actor/actors_integration.md delete mode 100644 concepts/actor/enable_actor_pattern.md diff --git a/concepts/actor/actor_pattern.md b/concepts/actor/actor_pattern.md deleted file mode 100644 index c7ad188a0b3..00000000000 --- a/concepts/actor/actor_pattern.md +++ /dev/null @@ -1,65 +0,0 @@ -# Actor Pattern with Dapr - -Dapr is a new programming model that is based on RPC communication between the framework and the user code, namely HTTP. However, it does support developers to write their code using the Actor Pattern. Specifically, Dapr allows a contextual Id to be associated with messages. Dapr provides: - -1) Routing by a contextual Id. -2) Ensuring single-threaded access per contextual Id. -3) Setting and getting state by a contextual Id is serialized. - -The combination of above behaviors delivers essential characteristics of an Actor: uniquely identified, single-threaded, with isolated state. - -## Authoring an Actor - -In Dapr, authoring Actor code is no difference with writing any other service code. An Actor in this case is a web server that listens to any number of messages the actor expects to handle. - -When a request is routed to a handler of the web server, a contextual Id may present in the request header. Dapr guarantees that requests with the same contextual Id are dispatched to the web server sequentially. - -Handler code can set or retrieve state from the Dapr sidecar with the contextual Id attached. - -## Talking to an Actor - -Just like invoking any other Dapr instances, you can send a request to an Actor by doing a POST to the sidecar. The **to** address of your message will be in the format of: -```yaml -. -``` - -> Dapr uses **virtual actors** pattern. You don't need to explicitly create or destroy Actor instances. - -For example, the following POST request to **/set-temperature** sends a temperature payload to a **theromstat** with id **123**: -```json -{ - "to": [ - "theromstat.123" - ], - "data": { - "temperature": 72 - } -} -``` - -Your code can access the response from the actor through the HTTP response body. - -Dapr also allows you to make direct calls to actors. The Dapr sidecar provides a special **/actor** route that can be used to route requests to actor instance. For example, to invoke the above actor directly, send a POST request to: -```bash -http://localhost:/actors/theromstat/123 -``` - -## Key Differences From a Full Actor Framework - -Dapr programming model is not an Actor programming model. Although it provides certain actor characteristics, Dapr differ from common Actor programming model in several ways. - -### Single Activation - -Many Actor frameworks requires single activation of an actor at any time. Dapr doesn’t offer such guarantees. There should be a single activation for the most of time. However, multiple activations may exist during failovers, scaling, and network partitions. Dapr will converge back to single activation when such conditions are resolved. - -Dapr offers exact-once delivery within a configurable window. Dapr delivers requests for the same actor id to the same service instance, while serializing client requests as well as state access of an instance. The combination of these features offers a high-fidelity simulation of the single activation behavior. However, there could be corner cases that cause problems when multiple activations do occur. - -### State Transaction Scope - -Some Actor frameworks allow wrapping multiple state operations into an atomic transaction. In Dapr, each state operation is a separate transaction. Because Dapr doesn't dictate how user code is written, a user may trigger multiple state transactions in the code. If the code crashes between transactions, the state is left at the last committed transaction. - - -## More Information -To learn more about Dapr Actor Pattern support, consult the following topics: - -* [Enabling the Actor Pattern](../../topics/enable_actor_pattern.md) \ No newline at end of file diff --git a/concepts/actor/actors_features.md b/concepts/actor/actors_features.md index ab4264d3142..3f2b6b232ff 100644 --- a/concepts/actor/actors_features.md +++ b/concepts/actor/actors_features.md @@ -1,11 +1,11 @@ # Dapr Actors Runtime -Dapr Actors runtime provides capability to use Actor pattern features. +Dapr Actors runtime provides following capabilities: ## Actor State Management - Actors are single-threaded objects that can encapsulate both logic and state. Because Dapr provides the state management, so Actors can maintain state reliably by using the same persistence and replication mechanisms. This way, actors don't lose their state after failures, upon reactivation after garbage collection, or when they are moved around between pods in a cluster due to resource balancing or upgrades. + Actors can save state reliably using state management capability. - You can interact with Dapr Actors runtime through Http/gRPC endpoints for state management. + You can interact with Dapr through Http/gRPC endpoints for state management. ### Save the Actor State diff --git a/concepts/actor/actors_integration.md b/concepts/actor/actors_integration.md deleted file mode 100644 index 4b5c7e87595..00000000000 --- a/concepts/actor/actors_integration.md +++ /dev/null @@ -1,41 +0,0 @@ -# Integration with Actor Frameworks -This article introduces how Dapr integrate with existing Actor Frameworks such as [Orleans](https://github.com/dotnet/orleans), [Akka](https://akka.io/), and [Service Fabric Reliable Actors](https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-actors-introduction). With Dapr integration, these Actor frameworks will allow developers to write Actor code in any programming languages, and to plug their Actors into Dapr eventing pipeline that enables reliable messaging, pub-sub, binding to event sources and many other features. - -## Client-side integration -On the client side, Dapr acts as a shim in front of an Actor proxy. This allows Dapr to bring reliable messaging, binding and other features to the connected Actor framework. -![Actors client](../imgs/actors_client.png) - -## Server-side integration -On the server side, Dapr leverages Actor framework capabilities such as state management and single activation guarantee to offer complete Actor framework capabilities. -Dapr defines an **Actor API**, which the integrated Actor frameworks are supposed to implement/support. - -> Dapr comes with a built-in Actor framework implemenation through the same Actor API. - -The following diagram illustrates two possible execution paths. ![Actors server](../imgs/actors_server.png) - -### Client calling an Actor (green path) - -1. A client makes a call to an Actor instance. -2. Dapr calls an Actor proxy to forward the request. -3. As the Actor runtime activates/invokes an Actor, it calls Dapr through the Actor API to invoke the user method. -4. Dapr forwards the request to user code through Dapr API. -5. As the response is returned, it was sent back to client as a response to the original request. - -### A message triggering an Actor (yellow path) - -1. A message is routed to the Dapr instance that is hosting the destination Actor. -2. Dapr dispatches the message to the Actor runtime when possible. -3. The rest of the steps are the same as the green path. - -## Actor API -At a high level, the Actor API shall contain the following methods: - -* Dispatch to Actor when possible -* Call method on an Actor -* Load/save state -* Create/remove -* Locate & send message to an Actor - -## Custom Programming Experience -Custom programming experiences can be built on top of Dapr through a custom library. The Custom library adapts Dapr API to a custom API shape that the user code consumes, as shown in the following diagram: -![custom_experience](../imgs/programming_experience.png) \ No newline at end of file diff --git a/concepts/actor/enable_actor_pattern.md b/concepts/actor/enable_actor_pattern.md deleted file mode 100644 index 16cdb88813a..00000000000 --- a/concepts/actor/enable_actor_pattern.md +++ /dev/null @@ -1,76 +0,0 @@ -# Enabling the Actor Pattern -The Actor Pattern has been broadly used in modeling complex distributed systems in which a large number of individual agents work together. For example, in many IoT solutions, actors are often used as digital presences of physical devices. Dapr supports the Actor Pattern by offering key characteristics of an actor. This document introduces architecturally how Dapr enables the Actor Pattern. To learn about how to use the Actor Pattern with Dapr, please read [this document](../concepts/actor/actor_pattern.md). - -## Overview -Dapr uses an off-path **partition table** to assign actor ids to service instances so that requests to the same actor id is always routed to the same instance. The partition table is dynamically adjusted when re-partitioning or failover happens. Changes to the table are broadcasted to Dapr sidecars to update their own settings to match with the global table. - -A client can talk to an actor through either reliable messaging or direct invocation, as illustrated by the following diagram: -![actor pattern](../imgs/actor_pattern.png) - -### Calling an actor through messaging -1. When a process pair of user code and Dapr sidecar comes up, the sidecar registers the pair (such as a Pod on Kubernetes) with a **partition table** hosted on the Dapr control plane. -2. The partition table updates itself to reflect the topology change.Then, it broadcasts a change notification to all Dapr sidecars. -3. The Dapr sidecar updates its own settings to poll messages from corresponding partitions of a reliable queue. -4. The client code sends requests to the reliable queue, which puts the requests in corresponding partitions based on the associated contextual ids. Then, the messages are picked up and consumed during the next poll. - -### Calling an actor through direct invocation -1. The client sidecar reads the partition table to find actor id assignments. -2. The sidecar figures out a direct route to the target service instance and sends the request direct to the destination sidecar. - -## Messaging - -When enabled, each Dapr sidecar has a designated reliable message queue. This allows the sidecar to sequentialize requests to a specific actor id. Dapr supports at-least-once delivery and exact-once delivery within a configurable time window. Please see [reliable messaging](TBD) for more details. - -Reliable messing is not used for direct invocations. In such a case, user code is expected to handle response errors and retry the request as needed. - -## State Management - -All state access are encapsulated in a **state provider**. Dapr expects a state provider to offer state partitioning for scale and replication for high availability and reliability. - -Because all requests to an actor instance are routed to the same Dapr service instance, the user code can use local variables as local caches of its state. - -When Dapr routes an actor instance to a new Dapr service instance, it invokes the **/state** endpoint so that the actor instance can restore state from the state store. - -## Partition Table - -Dapr uses different strategies to manage and use the partition table for different scenarios. Although partition table doesn’t sit on active data path, Dapr tries to employ any possible optimizations to minimize the overheads of table management and lookups. - -### Skipping the table - -If an Dapr service is stateless, and if only direct invocation is needed, the partition table is skipped. In this case, requests to actor instances are distributed by the service load balancer. - -If an Dapr service is stateless, and is known to have light traffic so that messaging system partition is not needed, the table can also be skipped even when reliable messaging is used, because all Dapr instances will simply compete for the latest messages from the same partition. - -If Dapr services have stable identifiers (i.e. doesn’t change when restarted or relocated), and both the possible range of actor Ids and all Dapr service ids are known, a predefined algorithm can be used to decide actor partitions instead of looking up the partition table. However, in such a case, dynamic partitioning is not allowed. - -### Range-only table - -Range-only table contains rows of actor id ranges only. When the service replica number changes, the table is updated so that the possible range is evenly distributed across all service replicas. - -The partition table can change its assignments based on partition loads. For example, when it finds the first partition is heavily used than others, it can reassign multiple service instances to the partition through **dynamic assignments**, or re-partition through **dynamic ranges**, as shown by the following diagram: - -![dynamic range](../imgs/dynamic_range.png) - -Dynamic assignments requires less sidecar configuration changes, but it requires a sidecar being able to handle multiple partitions. - -### Per-actor table - -Per-actor table maintains a detailed mapping between actor ids and service instances. Per-actor table is quite expensive to maintain. It’s most useful when the actor code fluctuates in resource consumption when given different workloads. In such case, a more sophisticated scheduling algorithm, such as a greedy algorithm or a dynamic programming algorithm, can be used to place the actor instances. - -In addition to the increased maintenance burden, per-actor table also triggers sidecar configuration updates much more frequently. And the sidecar needs to be able to handle scattered id ranges, when could be hard to be implemented against certain messaging systems. - -In the above discussion, it's been assumed that service instances have stable identifiers. If this is not the case, a check-in-check-out mechanism is needed for a service instance to associate itself to a given partition. In such as case, the partition table defines partition ranges but doesn’t define assignments. Instead, all sidecars come in as competing consumers and attempt to check out partitions. A partition can be explicitly checked in for scenarios such controlled upgrades. Otherwise, a checkout expires after certain time window and the partition is made available for checkouts again. - -## Sequential Access - -When configured to run as actors, Dapr sidecar dispatches messages to user code. The user code is free to use whatever threading model of choice to handle these messages. When the user code tries to preserve state, the state write requests are again dispatched to the underlying state store sequentially. - -Dapr allows read-only requests (signified by the GET verb) to be routed to any service instances. This allows the single-writer-multiple-reader pattern, in which readers get eventual consistent (but almost always up-to-date - the delta is the single in-flight transaction) reads on actor states. - -Such sequential access pattern is broken when multiple activations occur. For example, due to network partition, two service instances get different partition table data and try to poll data from the same partition. One message for an actor goes to intance A and the subsquent message for the same actor goes to instance B. This may lead to consistency issues. - -One way to partially mitigate this is to add a auto-increment version tag on state data so that the user code can check for conflicting updates while submitting its changes. - -## Summary - -Dapr can be used as building blocks to build a complete Actor framework but itself isn’t one. As a developer, you should be aware that when you use Dapr by itself, you can configure it to offer some characteristics of an Actor, but you should not assume it gives a complete feature set as a complete Actor framework. \ No newline at end of file