From be9af3b9796e8714c048bf9fb54989b0692be771 Mon Sep 17 00:00:00 2001 From: Chris Gillum Date: Sat, 4 Feb 2023 17:37:32 -0800 Subject: [PATCH] Add monitor diagram Signed-off-by: Chris Gillum --- .../workflow/workflow-patterns.md | 6 +++++- .../workflow-monitor-pattern.png | Bin 0 -> 22807 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 daprdocs/static/images/workflow-overview/workflow-monitor-pattern.png diff --git a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-patterns.md b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-patterns.md index 8756c1f41..e4a5b8413 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-patterns.md +++ b/daprdocs/content/en/developing-applications/building-blocks/workflow/workflow-patterns.md @@ -204,10 +204,14 @@ As you can see from the previous example, the runtime status of the workflow is The monitor pattern is recurring process that typically: 1. Checks the status of a system -1. Takes some action based on that status +1. Takes some action based on that status - e.g. send a notification 1. Sleeps for some period of time 1. Repeat +The following diagram provides a rough illustration of this pattern. + +Diagram showing how the monitor pattern works + Depending on the business needs, there may be a single monitor or there may be multiple monitors, one for each business entity (for example, a stock). Furthermore, the amount of time to sleep may need to change, depending on the circumstances. These requirements make using cron-based scheduling systems impractical. Dapr Workflow supports this pattern natively by allowing you to implement _eternal workflows_. Rather than writing infinite while-loops ([which is an anti-pattern]({{< ref "workflow-features-concepts.md#infinite-loops-and-eternal-workflows" >}})), Dapr Workflow exposes a _continue-as-new_ API that workflow authors can use to restart a workflow function from the beginning with a new input. diff --git a/daprdocs/static/images/workflow-overview/workflow-monitor-pattern.png b/daprdocs/static/images/workflow-overview/workflow-monitor-pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..52f63d7e70b6cb14bc2c0593a4fb73cf1b28e925 GIT binary patch literal 22807 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