Temporal and PURISTA

PURISTA excels at building isolated, message-driven business capabilities. Temporal excels at orchestrating long-running, failure-prone processes across those capabilities. Together, they handle the full spectrum from simple commands to complex sagas.

What each layer does

Layer Responsibility Example
PURISTA Business logic, type safety, message routing createOrder, processPayment, reserveInventory
Temporal Workflow orchestration, retries, timeouts, compensation “Reserve inventory, then charge payment, then ship — and undo if anything fails”
sequenceDiagram
    participant T as Temporal Workflow
    participant P as PURISTA Event Bridge
    participant S1 as Inventory Service
    participant S2 as Payment Service
    participant S3 as Shipping Service

    T->>P: command: reserveInventory
    P->>S1: reserve items
    S1->>P: success: inventoryReserved
    P->>T: response

    T->>P: command: processPayment
    P->>S2: charge card
    S2->>P: success: paymentProcessed
    P->>T: response

    T->>P: command: createShipment
    P->>S3: schedule delivery
    S3->>P: success: shipmentCreated
    P->>T: response

Why combine them

PURISTA handles immediate request/response and event-driven reactions well. But some business processes span minutes, hours, or days:

  • Order fulfillment — reserve stock, charge payment, ship, confirm delivery
  • User onboarding — send email, wait for verification, provision account, send welcome
  • Billing cycles — generate invoices, retry failed charges, escalate after N attempts
  • Approval workflows — submit request, wait for human approval, execute or reject

Temporal manages the orchestration layer:

  • Retries with backoff — retry failed activities automatically
  • Timeouts — fail or compensate when steps take too long
  • Sagas — undo completed steps when later steps fail
  • Human-in-the-loop — pause workflows until external signals arrive
  • Observability — see the full workflow state, history, and pending actions

Architecture

flowchart TB
    subgraph TEMPORAL["Temporal"]
        W["Workflow Engine"]
        A["Activities"]
    end
    subgraph PURISTA["PURISTA"]
        EB["Event Bridge"]
        S1["Order Service"]
        S2["Payment Service"]
        S3["Email Service"]
    end
    W -->|calls| A
    A -->|command messages| EB
    EB --> S1
    EB --> S2
    EB --> S3
    S1 -->|events| EB
    S2 -->|events| EB
    S3 -->|events| EB
    EB -->|signals| W

Temporal activities send PURISTA command messages. PURISTA subscriptions can signal Temporal workflows when events occur.

When to use Temporal

Use case PURISTA alone PURISTA + Temporal
Simple CRUD ✅ Overkill
Event-driven reactions ✅ Overkill
Multi-step process with retries ⚠️ ✅
Human approval required ❌ ✅
Saga/compensation pattern ❌ ✅
Long-running (hours/days) ❌ ✅

Next steps