source/projects/flowmetal/call_cc_airflow.md

2 KiB

An Asynchronous, Distributed Task Engine

This document presents a design without reference implementation for a distributed programming system; sometimes called a workflow engine. It is intended to provide architectural level clarity allowing for the development of alternative designs or implementations as may suit.

Problem Statement

In building, operating and maintaining distributed systems (many computers in concert) engineers face a tooling gap.

Within the confines of a single computer, we have shells (bash, csh, zsh, oil etc.) and a suite of small programs which mesh together well enough for the completion of small tasks with ad-hoc automation. This is an enormous tooling win, as it allows small tasks to be automated at least for a time with a minimum of effort and with tools close to hand.

In interacting with networks, communicating between computers is difficult with traditional tools and communication failure becomes an ever-present concern. Traditional automation tools such as shells are inadequate for this environment because achieving network communication is excessively difficult.

In a distributed environment it cannot be assumed that a single machine can remain available to execute automation; This requires an approach to automation which allows for the incremental execution of single tasks at a time with provisions for relocation and recovery should failure occur.

It also cannot be assumed that a single machine is sufficiently available to receive and process incoming events such as callbacks. A distributed system is needed to wrangle distributed systems.

Design Considerations

  • Timeouts are everywhere
  • Sub-Turing/boundable

Architectural Overview

Events

Things that will happen, or time out.

Actions

Things the workflow will do, or time out.

Bindings

Data the workflow either was given or computed.

Conditionals

Decisions the workflow may make.

Functions

A convenient way to talk about fragments of control flow graph.

Tracing & Reporting