From 224351ccc2a207170b18bcbca7b09bbdea23e458 Mon Sep 17 00:00:00 2001 From: Nikolay Mahotkin Date: Fri, 28 Aug 2015 17:09:07 +0300 Subject: [PATCH] Mistral documentation: architecture Implements blueprint: mistral-docs-general Change-Id: I4c398a8677b8c0c6004755db989746f1e918ceea --- doc/source/architecture.rst | 8 ++++++++ doc/source/img/mistral_architecture.png | Bin 0 -> 27152 bytes 2 files changed, 8 insertions(+) create mode 100644 doc/source/img/mistral_architecture.png diff --git a/doc/source/architecture.rst b/doc/source/architecture.rst index 383774239..5a9d4e6b9 100644 --- a/doc/source/architecture.rst +++ b/doc/source/architecture.rst @@ -1,2 +1,10 @@ Architecture ============ + +.. image:: img/mistral_architecture.png + +* Engine - handles control and data flow of workflow executions. Computes which tasks are ready and places them in a queue. Passes the data from task to task, deals with condition transitions, etc. +* Task Executors - execute task Actions. Pick up tasks from the queue, run actions, and send results back to the engine. +* API server - exposes REST API to operate and monitor workflow executions. +* Scheduler - stores and executes delayed calls. It is the important Mistral component since it interacts with engine and executors. It also triggers workflows on events (e.g., periodic cron event) +* Persistence - stores workflow definitions, current execution states, and past execution results. diff --git a/doc/source/img/mistral_architecture.png b/doc/source/img/mistral_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..8a992b88f48893d007229237b8f7aa3d683f6521 GIT binary patch literal 27152 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 k6GCn9Um^eB*Otb~MbB8(Jq8{91pK>{