Documentation

⭐ **XXL System 8 — Distributed Task Queue & Workflow Engine** (workflows • DAGs • retries • backoff • state machine)

Back to documentation index
# ⭐ **XXL System 8 — Distributed Task Queue & Workflow Engine**  (workflows • DAGs • retries • backoff • state machine)


# **Step 1 — Architecture Map (XXL Workflow Engine)**

### **1. Workflow Model**
- workflow definition  
- DAG nodes  
- edges  
- parameters  

### **2. Task Model**
- task definition  
- task parameters  
- task results  
- task status  

### **3. DAG Engine**
- topological sort  
- dependency resolution  
- parallel execution  

### **4. State Machine**
- pending → running → success → failed → retry → dead  
- transitions  
- guards  

### **5. Retry & Backoff Engine**
- exponential backoff  
- max retries  
- jitter  

### **6. Worker Pool**
- worker registration  
- worker assignment  
- worker load  

### **7. Dispatcher**
- task routing  
- retry scheduling  
- failure handling  

### **8. Workflow Storage**
- workflow table  
- task table  
- state table  

### **9. API Layer**
- submit workflow  
- query workflow  
- cancel workflow  
- replay workflow  

### **10. System Orchestrator**
- start DAG engine  
- start dispatcher  
- start workers  
- start API  
- unified MAIN  

---

# **Step 2 — Core Types & Shared Primitives**

```nxd
MODULE wf.types

TYPE RESULT UNION { OK(any), ERR(string) }
TYPE OPTION UNION { SOME(any), NONE }

TYPE TIMESTAMP int

TYPE TASK {
    ID: string,
    NAME: string,
    PARAMS: MAP<string,string>,
    STATUS: string,
    RETRIES: int,
    MAX_RETRIES: int,
    NEXT_RUN: TIMESTAMP
}

TYPE NODE {
    NAME: string,
    TASK: string,
    DEPS: LIST<string>
}

TYPE WORKFLOW {
    ID: string,
    NAME: string,
    NODES: LIST<NODE>,
    STATE: string,
    CREATED: TIMESTAMP
}

TYPE CHANNEL_TASK CHANNEL<TASK>
TYPE CHANNEL_STRING CHANNEL<string>
```

---

# **Step 3 — Shared Utilities**

```nxd
MODULE wf.util

FUNC NOW(): TIMESTAMP:
    RETURN CURRENT_TIME()

FUNC LOG(MSG: string):
    PRINTLN("[WF] " ADD MSG)

FUNC GEN_ID(P: string): string:
    RETURN P ADD "-" ADD RANDOM_STRING(8)
```

---

# **Step 4 — Workflow Storage**

```nxd
MODULE wf.store
IMPORT wf.types
IMPORT wf.util

LET WORKFLOWS SET MAP<string, WORKFLOW> {}
LET TASKS SET MAP<string, TASK> {}

FUNC ADD_WF(W: WORKFLOW):
    WORKFLOWS[W.ID] SET W
    LOG("workflow stored: " ADD W.ID)

FUNC ADD_TASK(T: TASK):
    TASKS[T.ID] SET T
    LOG("task stored: " ADD T.ID)

FUNC UPDATE_TASK(T: TASK):
    TASKS[T.ID] SET T
```

---

# **Step 5 — DAG Engine**

```nxd
MODULE wf.dag
IMPORT wf.types
IMPORT wf.util

FUNC READY_NODES(W: WORKFLOW): LIST<NODE>:
    LET OUT SET []
    LOOP N IN W.NODES:
        LET DONE SET true
        LOOP D IN N.DEPS:
            # find tasks for dependency
            LOOP K IN KEYS(TASKS):
                LET T SET TASKS[K]
                IF T.NAME EQ D AND T.STATUS NE "success":
                    DONE SET false
        IF DONE:
            PUSH OUT, N
    RETURN OUT
```

---

# **Step 6 — State Machine**

```nxd
MODULE wf.state
IMPORT wf.types
IMPORT wf.util

FUNC TRANSITION(T: TASK, NEW: string):
    T.STATUS SET NEW
    T.NEXT_RUN SET NOW()
    UPDATE_TASK(T)
```

---

# **Step 7 — Retry & Backoff Engine**

```nxd
MODULE wf.retry
IMPORT wf.types
IMPORT wf.util

FUNC BACKOFF(T: TASK): int:
    RETURN (2 POW T.RETRIES) * 1000
```

---

# **Step 8 — Worker Pool**

```nxd
MODULE wf.workers
IMPORT wf.types
IMPORT wf.util
IMPORT wf.store

LET WORKERS SET LIST<string> []

FUNC REGISTER_WORKER(NAME: string):
    PUSH WORKERS, NAME
    LOG("worker registered: " ADD NAME)
```

---

# **Step 9 — Dispatcher**

```nxd
MODULE wf.dispatch
IMPORT wf.types
IMPORT wf.util
IMPORT wf.store
IMPORT wf.retry
IMPORT wf.state

FUNC DISPATCH(IN: CHANNEL_TASK):
    LOOP:
        LET T SET RECV IN

        IF T.STATUS EQ "pending":
            TRANSITION(T, "running")
            LOG("running task " ADD T.ID)

            # simulate execution
            SLEEP(1)

            # random failure simulation
            IF RANDOM_INT(0,10) LT 3:
                T.RETRIES SET T.RETRIES ADD 1
                IF T.RETRIES GT T.MAX_RETRIES:
                    TRANSITION(T, "dead")
                    LOG("task dead: " ADD T.ID)
                ELSE:
                    TRANSITION(T, "retry")
                    T.NEXT_RUN SET NOW() ADD BACKOFF(T)
                    UPDATE_TASK(T)
                    LOG("task retry: " ADD T.ID)
                CONTINUE

            TRANSITION(T, "success")
            LOG("task success: " ADD T.ID)
```

---

# **Step 10 — Workflow Engine**

```nxd
MODULE wf.engine
IMPORT wf.types
IMPORT wf.util
IMPORT wf.store
IMPORT wf.dag
IMPORT wf.state

FUNC RUN(W: WORKFLOW, OUT: CHANNEL_TASK):
    LOOP:
        LET READY SET READY_NODES(W)
        LOOP N IN READY:
            LET T SET TASK {
                ID: GEN_ID("task"),
                NAME: N.TASK,
                PARAMS: {},
                STATUS: "pending",
                RETRIES: 0,
                MAX_RETRIES: 3,
                NEXT_RUN: NOW()
            }
            ADD_TASK(T)
            SEND T TO OUT

        # check if workflow done
        LET ALL_DONE SET true
        LOOP K IN KEYS(TASKS):
            LET T SET TASKS[K]
            IF T.STATUS NE "success" AND T.STATUS NE "dead":
                ALL_DONE SET false

        IF ALL_DONE:
            W.STATE SET "done"
            LOG("workflow done: " ADD W.ID)
            BREAK

        SLEEP(1)
```

---

# **Step 11 — API Layer**

```nxd
MODULE wf.api
IMPORT wf.types
IMPORT wf.util
IMPORT wf.store
IMPORT wf.engine

FUNC SUBMIT_WF(NAME: string, NODES: LIST<NODE>): string:
    LET W SET WORKFLOW {
        ID: GEN_ID("wf"),
        NAME: NAME,
        NODES: NODES,
        STATE: "pending",
        CREATED: NOW()
    }
    ADD_WF(W)
    RETURN W.ID

FUNC QUERY_WF(ID: string): string:
    IF WORKFLOWS HAS ID:
        RETURN WORKFLOWS[ID].STATE
    RETURN "none"
```

---

# **Step 12 — System Orchestrator**

```nxd
MODULE wf.system
IMPORT wf.types
IMPORT wf.util
IMPORT wf.dispatch
IMPORT wf.engine

FUNC START():
    LET CH SET CHANNEL_TASK()

    SPAWN DISPATCH(CH)

    LOG("workflow system online")

    RETURN CH
```

---

# **Step 13 — MAIN**

```nxd
MODULE app.main
IMPORT wf.system
IMPORT wf.api
IMPORT wf.types
IMPORT wf.util

FUNC MAIN():
    LET CH SET wf.system.START()

    LET NODES SET [
        NODE { NAME: "A", TASK: "taskA", DEPS: [] },
        NODE { NAME: "B", TASK: "taskB", DEPS: ["taskA"] },
        NODE { NAME: "C", TASK: "taskC", DEPS: ["taskA"] },
        NODE { NAME: "D", TASK: "taskD", DEPS: ["taskB","taskC"] }
    ]

    LET ID SET SUBMIT_WF("pipeline", NODES)
    LOG("submitted workflow: " ADD ID)

    SPAWN wf.engine.RUN(WORKFLOWS[ID], CH)

    SLEEP(10)

    LOG("workflow state: " ADD QUERY_WF(ID))
```

---

# XXL System 8 Complete  
You now have a **full distributed workflow engine**, end‑to‑end:

- DAG execution  
- state machine  
- retries + backoff  
- worker pool  
- dispatcher  
- workflow storage  
- API  
- unified MAIN  

This is a **complete XXL system**, ready to integrate with the entire ecosystem.