Uses `TriggerAction.Enqueue({ queue })` and named queues for reliable background work. Use when a request should hand off slow work and return quickly, a task must retry on failure, jobs need concurrency limits or FIFO ordering, or a workflow needs durable async processing, backoff, and dead-letter handling.
64
75%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
Optimize this skill with Tessl
npx tessl skill review --optimize ./skills/iii-queue-processing/SKILL.mdComparable to: BullMQ, Celery, SQS
Use the concepts below when they fit the task. Not every queue setup needs all of them.
iii-config.yaml under queue_configsTriggerAction.Enqueue({ queue }) dispatches a job to a named queueiii worker add iii-queueiii::durable::publish plus trigger type durable:subscribermax_retriesmessageReceiptIdProducer function
→ TriggerAction.Enqueue({ queue: 'task-queue' })
→ Named Queue (standard or FIFO)
→ Consumer registerFunction handler
→ success / retry with backoff
→ Dead Letter Queue (after max_retries)| Primitive | Purpose |
|---|---|
registerFunction | Define the consumer that processes jobs |
trigger({ ..., action: TriggerAction.Enqueue({ queue }) }) | Dispatch a job to a named queue |
trigger({ function_id: 'iii::durable::publish', payload }) | Publish a durable topic event to subscribers |
registerTrigger({ type: 'durable:subscriber' }) | Subscribe a function to a durable topic |
messageReceiptId | Acknowledge or track individual job processing |
queue_configs in iii-config.yaml | Declare queues with concurrency and retries |
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
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 jobtrigger({ function_id: 'iii::durable::publish', payload: { topic, data } }) — durable fanout eventregisterTrigger({ type: 'durable:subscriber', config: { topic } }) — durable topic consumerpayload.messageReceiptId — track or acknowledge the jobtrigger({ function_id: 'state::set', payload }) — persist results after processingconst logger = new Logger() — structured logging per jobUse the adaptations below when they apply to the task.
max_retries and concurrency in queue config to match your workloadNamed 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.
Install/enable the queue worker with iii worker add iii-queue. Use the builtin adapter for local/single-instance deployments and RabbitMQ for multi-instance named queues with retries, FIFO, and DLQ. Redis is for topic-style pub/sub and publish-only named queue paths, not full named queue consumption.
iii-trigger-actions with TriggerAction.Void().iii-dead-letter-queues for the DLQ consumer.iii-workflow-orchestration.iii-queue-processing when the primary need is reliable async job execution with retries.iii-queue-processing in the iii engine.a7ebbbb
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.