Agent skill
iii-queue-processing
Enqueues jobs, configures retry policies, sets concurrency limits, and orders messages via named standard or FIFO queues. Use when building background job workers, task queues, message queues, async pipelines, or any pattern needing guaranteed delivery with exponential backoff and dead-letter handling.
Install this agent skill to your Project
npx add-skill https://github.com/iii-hq/iii/tree/main/skills/iii-queue-processing
SKILL.md
Queue Processing
Comparable to: BullMQ, Celery, SQS
Key Concepts
Use the concepts below when they fit the task. Not every queue setup needs all of them.
- Named queues are declared in
iii-config.yamlunderqueue_configs - Standard queues process jobs concurrently; FIFO queues preserve ordering
TriggerAction.Enqueue({ queue })dispatches a job to a named queue- Failed jobs auto-retry with exponential backoff up to
max_retries - Jobs that exhaust retries land in a dead letter queue for inspection
- Each consumer function receives the job payload and a
messageReceiptId - Fan-out is achieved by having one producer trigger multiple distinct consumer functions via separate enqueue calls
Architecture
Producer function
→ TriggerAction.Enqueue({ queue: 'task-queue' })
→ Named Queue (standard or FIFO)
→ Consumer registerFunction handler
→ success / retry with backoff
→ Dead Letter Queue (after max_retries)
iii Primitives Used
| Primitive | Purpose |
|---|---|
registerFunction |
Define the consumer that processes jobs |
trigger({ ..., action: TriggerAction.Enqueue({ queue }) }) |
Dispatch a job to a named queue |
messageReceiptId |
Acknowledge or track individual job processing |
queue_configs in iii-config.yaml |
Declare queues with concurrency and retries |
Reference Implementation
See ../references/queue-processing.js for the full working example — a producer that enqueues jobs and a consumer that processes them with retry logic.
Also available in Python: ../references/queue-processing.py
Also available in Rust: ../references/queue-processing.rs
Common Patterns
Code using this pattern commonly includes, when relevant:
registerWorker(url, { workerName })— worker initializationregisterFunction(id, handler)— define the consumertrigger({ function_id, payload, action: TriggerAction.Enqueue({ queue }) })— enqueue a jobpayload.messageReceiptId— track or acknowledge the jobtrigger({ function_id: 'state::set', payload })— persist results after processingconst logger = new Logger()— structured logging per job
Adapting This Pattern
Use the adaptations below when they apply to the task.
- Choose FIFO queues when job ordering matters (e.g. sequential pipeline steps)
- Set
max_retriesandconcurrencyin queue config to match your workload - Chain multiple queues for multi-stage pipelines (queue A consumer enqueues to queue B)
- For idempotency, check state before processing to avoid duplicate work on retries
- Use fan-out by enqueuing to multiple consumer functions when a single event requires parallel processing (e.g. payment + notification + audit)
Engine Configuration
Named queues are declared in iii-config.yaml under queue_configs with per-queue max_retries, concurrency, type, and backoff_ms. Fan-out is a pattern (one producer triggers multiple consumer functions), not a queue config key. See ../references/iii-config.yaml for the full annotated config reference.
Pattern Boundaries
- If the task only needs fire-and-forget without retries or ordering, prefer
iii-trigger-actionswithTriggerAction.Void(). - If failed jobs need special handling or alerting, prefer
iii-dead-letter-queuesfor the DLQ consumer. - If the task is step-by-step orchestration with branching, prefer
iii-workflow-orchestration. - Stay with
iii-queue-processingwhen the primary need is reliable async job execution with retries.
When to Use
- Use this skill when the task is primarily about
iii-queue-processingin the iii engine. - Triggers when the request directly asks for this pattern or an equivalent implementation.
Boundaries
- Never use this skill as a generic fallback for unrelated tasks.
- You must not apply this skill when a more specific iii skill is a better fit.
- Always verify environment and safety constraints before applying examples from this skill.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
iii-dead-letter-queues
Inspects and redrives jobs that exhausted all retries. Use when handling failed queue jobs, debugging processing errors, or implementing retry strategies.
iii-cron-scheduling
Registers cron triggers with 7-field expressions to run functions on recurring schedules. Use when scheduling periodic jobs, timed automation, crontab replacements, cleanup routines, report generation, health checks, batch processing, or any task that should run every N seconds, minutes, hours, or on a weekly/monthly calendar.
iii-http-invoked-functions
Registers external HTTP endpoints as iii functions using registerFunction(id, HttpInvocationConfig). Use when adapting legacy APIs, third-party webhooks, or immutable services into triggerable iii functions, especially when prompts ask for endpoint maps like { path, id } iterated into registerFunction calls.
iii-channels
Binary streaming between workers via channels. Use when building data pipelines, file transfers, streaming responses, or any pattern requiring binary data transfer between functions.
iii-event-driven-cqrs
Implements CQRS with event sourcing on the iii engine. Use when building command/query separation, event-sourced systems, or fan-out architectures where commands publish domain events and multiple read model projections subscribe independently.
iii-agentic-backend
Creates and orchestrates multi-agent pipelines on the iii engine. Use when building AI agent collaboration, agent orchestration, research/review/synthesis chains, or any system where specialized agents hand off work through queues and shared state.
Didn't find tool you were looking for?