# Queues Configuration ## Create Queue ```bash wrangler queues create my-queue wrangler queues create my-queue --retention-period-hours=336 # 14 days wrangler queues create my-queue --delivery-delay-secs=300 ``` ## Producer Binding **wrangler.jsonc:** ```jsonc { "queues": { "producers": [ { "queue": "my-queue-name", "binding": "MY_QUEUE", "delivery_delay": 60 // Optional: default delay in seconds } ] } } ``` ## Consumer Configuration (Push-based) **wrangler.jsonc:** ```jsonc { "queues": { "consumers": [ { "queue": "my-queue-name", "max_batch_size": 10, // 1-100, default 10 "max_batch_timeout": 5, // 0-60s, default 5 "max_retries": 3, // default 3, max 100 "dead_letter_queue": "my-dlq", // optional "retry_delay": 300 // optional: delay retries in seconds } ] } } ``` ## Consumer Configuration (Pull-based) **wrangler.jsonc:** ```jsonc { "queues": { "consumers": [ { "queue": "my-queue-name", "type": "http_pull", "visibility_timeout_ms": 5000, // default 30000, max 12h "max_retries": 5, "dead_letter_queue": "my-dlq" } ] } } ``` ## TypeScript Types ```typescript interface Env { MY_QUEUE: Queue; ANALYTICS_QUEUE: Queue; } interface MessageBody { id: string; action: 'create' | 'update' | 'delete'; data: Record; } export default { async queue(batch: MessageBatch, env: Env): Promise { for (const msg of batch.messages) { console.log(msg.body.action); msg.ack(); } } } satisfies ExportedHandler; ``` ## Content Type Selection Choose content type based on consumer type and data requirements: | Content Type | Use When | Readable By | Supports | Size | |--------------|----------|-------------|----------|------| | `json` | Pull consumers, dashboard visibility, simple objects | All (push/pull/dashboard) | JSON-serializable types only | Medium | | `v8` | Push consumers only, complex JS objects | Push consumers only | Date, Map, Set, BigInt, typed arrays | Small | | `text` | String-only payloads | All | Strings only | Smallest | | `bytes` | Binary data (images, files) | All | ArrayBuffer, Uint8Array | Variable | **Decision tree:** 1. Need to view in dashboard or use pull consumer? → Use `json` 2. Need Date, Map, Set, or other V8 types? → Use `v8` (push consumers only) 3. Just strings? → Use `text` 4. Binary data? → Use `bytes` ```typescript // JSON: Good for simple objects, pull consumers, dashboard visibility await env.QUEUE.send({ id: 123, name: 'test' }, { contentType: 'json' }); // V8: Good for Date, Map, Set (push consumers only) await env.QUEUE.send({ created: new Date(), tags: new Set(['a', 'b']) }, { contentType: 'v8' }); // Text: Simple strings await env.QUEUE.send('process-user-123', { contentType: 'text' }); // Bytes: Binary data await env.QUEUE.send(imageBuffer, { contentType: 'bytes' }); ``` **Default behavior:** If not specified, Cloudflare auto-selects `json` for JSON-serializable objects and `v8` for complex types. **IMPORTANT:** `v8` messages cannot be read by pull consumers or viewed in the dashboard. Use `json` if you need visibility or pull-based consumption. ## CLI Commands ```bash # Consumer management wrangler queues consumer add my-queue my-worker --batch-size=50 --max-retries=5 wrangler queues consumer http add my-queue wrangler queues consumer worker remove my-queue my-worker wrangler queues consumer http remove my-queue # Queue operations wrangler queues list wrangler queues pause my-queue wrangler queues resume my-queue wrangler queues purge my-queue wrangler queues delete my-queue ```