Back to Iii

Workers

docs/architecture/workers.mdx

0.13.04.6 KB
Original Source

A Worker is any process that connects to the iii Engine over WebSocket using an SDK and registers Functions. The Engine routes incoming triggers to the correct Worker, which executes the handler and optionally returns a result.

Workers are independent processes — they can be written in any language, run anywhere, and crash without affecting other Workers.

Diagrams

Architecture

mermaid
graph LR
    E[Engine]

    subgraph W1[Worker A]
        F1([Function A])
        F2([Function B])
    end

    subgraph W2[Worker B]
        F3([Function C])
    end

    W1 -- registerFunction --> E
    W2 -- registerFunction --> E
    E -- trigger --> W1
    E -- trigger --> W2

Lifecycle Overview

mermaid
flowchart TD
    Start(("registerWorker()")) --> Connecting
    Connecting -->|WebSocket open| Connected
    Connected -->|"Register
functions & triggers"| Registering
    Registering -->|All registered| Ready
    Ready -->|Invocation received| Executing
    Executing -.-> RS[Result sent]
    Ready -->|shutdown| ShuttingDown
    ShuttingDown --> End((Exit))
    Ready -->|Connection lost| Disconnected
    Disconnected -->|Auto-reconnect| Reconnecting
    Reconnecting -->|Reconnected| Connected
    Reconnecting -->|Max retries| Failed

Creating a Worker

A Worker is simply any collection of registered Functions and Triggers that has registered itself with the iii engine. See How to use Functions and Triggers for details on registering functions within workers. Read below for Worker responsibilities and configuration.

What Workers Do

ResponsibilityDescription
Function hostingRegister Functions with the Engine and execute them when triggered
SDK connectionConnect to the Engine via WebSocket, auto-reconnect on disconnect
Language runtimeRun in their own process in any iii-sdk supported language
IsolationWorkers are independent processes. A crash in one Worker doesn't propagate to others

Init Options

The second argument to registerWorker() configures the Worker's behavior:

OptionTypeDefaultDescription
workerNamestring${hostname}:${pid}Name shown in the iii Console and listWorkers()
invocationTimeoutMsnumber30000Default timeout for trigger() calls in milliseconds
enableMetricsReportingbooleantrueReport CPU, memory, and event loop metrics to the Engine
reconnectionConfigobjectsee belowWebSocket reconnection behavior
otelobjectautoOpenTelemetry configuration. Set { enabled: false } to disable

Reconnection Config

Workers reconnect automatically on disconnect using exponential backoff:

FieldDefaultDescription
initialDelayMs1000First retry delay
maxDelayMs30000Maximum retry delay cap
backoffMultiplier2Multiplier applied to delay each attempt
jitterFactor0.3Random jitter 0–1 to prevent thundering herd
maxRetries-1Maximum attempts. -1 = infinite

Python naming: Python uses snake_case for these fields: initial_delay_ms, max_delay_ms, backoff_multiplier, jitter_factor, max_retries.

typescript
import { registerWorker } from 'iii-sdk'

const iii = registerWorker('ws://localhost:49134', {
  workerName: 'user-service',
  invocationTimeoutMs: 10000,
  reconnectionConfig: {
    initialDelayMs: 500,
    maxDelayMs: 10000,
    maxRetries: 10,
  },
})

Worker Lifecycle

When a Worker connects, the SDK sends its metadata to the Engine via engine::workers::register:

runtime: 'node' | 'python' | 'rust'
version: SDK version
name: workerName
os: platform + arch

The Engine assigns a worker_id and the Worker's status transitions through:

connecting → connected → available / busy → disconnected

On disconnect — clean or crash — the Engine automatically removes all the Worker's registered Functions and Triggers. On reconnect, the SDK re-registers everything automatically.

Worker Metadata

You can inspect all connected Workers at runtime:

typescript
const workers = await iii.listWorkers()
// returns WorkerInfo[] with: id, name, runtime, version, os,
// status, connected_at_ms, function_count, functions[], active_invocations
python
workers = iii.list_workers()
<Info title="See also"> For details on building and deploying Workers in production, see the [Quickstart tutorial](/quickstart) or the [SDK Reference](/api-reference/iii-sdk). </Info>