From 54b1bda0f2f11177ecc238d8fa1b897746e9b1d0 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 1 Feb 2023 10:34:23 -0600 Subject: [PATCH] add diagrams, quick review of overview Signed-off-by: Hannah Hunter --- .../workflow/workflow-overview.md | 48 +++++++++++------- .../workflow-overview/workflows-chaining.png | Bin 0 -> 21249 bytes .../workflows-fanin-fanout.png | Bin 0 -> 28282 bytes 3 files changed, 30 insertions(+), 18 deletions(-) create mode 100644 daprdocs/static/images/workflow-overview/workflows-chaining.png create mode 100644 daprdocs/static/images/workflow-overview/workflows-fanin-fanout.png diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-overview.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-overview.md index 2dd00bfab..cdf541641 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-overview.md @@ -14,13 +14,13 @@ Dapr Workflow strives to make orchestrating logic for messaging, state managemen The durable, resilient Dapr Workflow capability: -- Offers a built-in workflow runtime for driving Dapr workflow execution +- Offers a built-in workflow runtime for driving Dapr Workflow execution - Provides HTTP and gRPC APIs for managing workflows - Will integrate with future supported external workflow runtime components -Diagram showing basics of Dapr workflows +Diagram showing basics of Dapr Workflows -Dapr workflows can assist with scenarios like: +Dapr Workflows can assist with scenarios like: - Order processing involving inventory management, payment systems, shipping, etc. - HR onboarding workflows coordinating tasks across multiple departments and participants @@ -34,7 +34,7 @@ Dapr Workflow consists of: - SDKs for authoring workflows in code, using any language - HTTP and gRPC APIs for managing workflows (start, query, suspend/resume, terminate) -The Dapr workflow engine is internally powered by Dapr's actor runtime. The following diagram illustrates the Dapr Workflow architecture in Kubernetes mode: +The Dapr Workflow engine is internally powered by Dapr's actor runtime. The following diagram illustrates the Dapr Workflow architecture in Kubernetes mode: Diagram showing how the workflow architecture works in Kubernetes mode @@ -42,7 +42,7 @@ Essentially, to use the Dapr Workflow building block, you write workflow code in Notice that the engine itself is embedded directly into the sidecar and implemented using the `durabletask-go` framework library. This framework allows you to swap out different storage providers, including a storage provider created specifically for Dapr that leverages internal actors behind the scenes. Since Dapr Workflows use actors, you can store workflow state in variety of Dapr-supported state stores, like Redis, CosmosDB, etc. -For more information about the architecture of Dapr Workflow, see the [workflow architecture]({{}}) article. +For more information about the architecture of Dapr Workflow, see the [workflow architecture]({{< ref workflow-architecture >}}) article. ## Features @@ -59,17 +59,23 @@ You can also get information on the workflow (even if it has been terminated or ## Workflow patterns -Dapr workflows simplify complex, stateful coordination requirements in microservice architectures. The following sections describe several application patterns that can benefit from Dapr workflows: +Dapr Workflows simplify complex, stateful coordination requirements in microservice architectures. The following sections describe several application patterns that can benefit from Dapr Workflows: ### Task chaining -In the task chaining pattern, multiple steps in a workflow are run in succession, and the output of one step may be passed as the input to the next step. Task chaining workflows typically involve creating a sequence of operations that need to be performed on some data, such as filtering, transforming, and reducing. In some cases, the steps of the workflow may need to be orchestrated across multiple microservices. For increased reliability and scalability, you're also likely to use queues to trigger the various steps. +In the task chaining pattern, multiple steps in a workflow are run in succession, and the output of one step may be passed as the input to the next step. Task chaining workflows typically involve creating a sequence of operations that need to be performed on some data, such as filtering, transforming, and reducing. -*TODO: DIAGRAM (`[step 1] --> [step 2] --> [step 3] --> [step 4]`)* +In some cases, the steps of the workflow may need to be orchestrated across multiple microservices. For increased reliability and scalability, you're also likely to use queues to trigger the various steps. -While the pattern is simple, there are many complexities hidden in the implementation. For example, what happens if one of the microservices are unavailable for an extended period of time? Can failed steps be automatically retried? If not, how do you facilitate the rollback of previously completed steps, if applicable? Implementation details aside, is there a way to visualize the workflow so that other engineers can understand what it does and how it works? +Diagram showing how the task chaining workflow pattern works -Dapr workflow solves these complexities by allowing you to implement the task chaining pattern concisely as a simple function in the programming language of your choice, as shown in the following example. +While the pattern is simple, there are many complexities hidden in the implementation. For example: +- What happens if one of the microservices are unavailable for an extended period of time? +- Can failed steps be automatically retried? +- If not, how do you facilitate the rollback of previously completed steps, if applicable? +- Implementation details aside, is there a way to visualize the workflow so that other engineers can understand what it does and how it works? + +Dapr Workflow solves these complexities by allowing you to implement the task chaining pattern concisely as a simple function in the programming language of your choice, as shown in the following example. {{< tabs ".NET" >}} @@ -105,12 +111,18 @@ catch (TaskFailedException) {{< /tabs >}} {{% alert title="Note" color="primary" %}} -"Step1", "Step2", "MyCompensation", etc. represent workflow activities, which are essentially other functions in your code that actually implement the steps of the workflow. For brevity, these implementations are left out of this example. +In the example above, `"Step1"`, `"Step2"`, `"MyCompensation"`, etc. represent workflow activities, which are essentially other functions in your code that actually implement the steps of the workflow. For brevity, these implementations are left out of this example. {{% /alert %}} As you can see, the workflow is expressed as a simple series of statements in the programming language of your choice. This allows any engineer in the organization to quickly understand the end-to-end flow without necessarily needing to understand the end-to-end system architecture. -Behind the scenes, the Dapr Workflow runtime takes care of executing the workflow and ensuring that it runs to completion. Progress is saved automatically and the workflow app will be effectively resumed from the last completed step if the workflow process itself fails for any reason. Error handling is expressed naturally in your target programming language, allowing you to implement compensation logic easily. There are even built-in retry configuration primitives to simplify the process of configuring complex retry policies for individual steps in the workflow. +Behind the scenes, the Dapr Workflow runtime: + +- Takes care of executing the workflow and ensuring that it runs to completion. +- Saves progress automatically. +- Nudges the worfklow app to effectively resume from the last completed step if the workflow process itself fails for any reason. +- Enables error handling to be expressed naturally in your target programming language, allowing you to implement compensation logic easily. +- Provides built-in retry configuration primitives to simplify the process of configuring complex retry policies for individual steps in the workflow. ### Fan out/fan in @@ -120,9 +132,9 @@ The fan out part of the pattern involves distributing the input data to multiple The fan in part of the pattern involves recombining the results from the workers into a single output. -TODO: DIAGRAM? +Diagram showing how the fan out/fan in workflow pattern works -This pattern can be implemented in a variety of ways, such as using message queues, channels, or async/await. The Dapr workflows extension handles this pattern with relatively simple code: +This pattern can be implemented in a variety of ways, such as using message queues, channels, or async/await. The Dapr Workflows extension handles this pattern with relatively simple code: TODO: CODE EXAMPLE @@ -132,7 +144,7 @@ In an asynchronous HTTP API pattern, you coordinate non-blocking requests and re TODO: DIAGRAM? -Dapr workflows simplifies or even removing the code you need to write to interact with long-running function executions. +Dapr Workflows simplifies or even removing the code you need to write to interact with long-running function executions. TODO: CODE EXAMPLE @@ -154,11 +166,11 @@ TODO: CODE EXAMPLE ## What is the authoring SDK? -The Dapr Workflow _authoring SDK_ is a language-specific SDK that you use to implement workflow logic. The workflow logic lives in your application and is orchestrated by the Dapr workflow engine running in the Dapr sidecar via a gRPC stream. +The Dapr Workflow _authoring SDK_ is a language-specific SDK that you use to implement workflow logic. The workflow logic lives in your application and is orchestrated by the Dapr Workflow engine running in the Dapr sidecar via a gRPC stream. TODO: Diagram -The Dapr Workflow authoring SDK contains many types and functions that allow you to take full advantage of the features and capabilities offered by the Dapr workflow engine. +The Dapr Workflow authoring SDK contains many types and functions that allow you to take full advantage of the features and capabilities offered by the Dapr Workflow engine. NOTE: The Dapr Workflow authoring SDK is only valid for use with the Dapr Workflow engine. It cannot be used with other external workflow services. @@ -172,7 +184,7 @@ Currently, you can use the following SDK languages to author a workflow. ### Declarative workflows support -Dapr workflow doesn't currently provides any experience for declarative workflows. However, you can use the Dapr SDKs to build a new, portable workflow runtime that leverages the Dapr sidecar to load and execute declarative workflows as a layer on top of the "workflow-as-code" foundation. Such an approach could be used to support a variety of declarative workflows, including: +Dapr Workflow doesn't currently provides any experience for declarative workflows. However, you can use the Dapr SDKs to build a new, portable workflow runtime that leverages the Dapr sidecar to load and execute declarative workflows as a layer on top of the "workflow-as-code" foundation. Such an approach could be used to support a variety of declarative workflows, including: - The [AWS Step Functions workflow syntax](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-amazon-states-language.html) - The [Azure Logic Apps workflow syntax](https://learn.microsoft.com/azure/logic-apps/logic-apps-workflow-definition-language) diff --git a/daprdocs/static/images/workflow-overview/workflows-chaining.png b/daprdocs/static/images/workflow-overview/workflows-chaining.png new file mode 100644 index 0000000000000000000000000000000000000000..68a9d81bf0aecfd59209193bdc05905f91927803 GIT binary patch literal 21249 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 W{tY3GZ*%<)7*p6aqY6WpnEwFt11D|( literal 0 HcmV?d00001 diff --git a/daprdocs/static/images/workflow-overview/workflows-fanin-fanout.png b/daprdocs/static/images/workflow-overview/workflows-fanin-fanout.png new file mode 100644 index 0000000000000000000000000000000000000000..bc53a3c543c34cb91ef531d138adc2b5080a69f4 GIT binary patch literal 28282 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