# 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<MessageBody>
  ANALYTICS_QUEUE: Queue<AnalyticsEvent>
}

interface MessageBody {
  id: string
  action: 'create' | 'update' | 'delete'
  data: Record<string, any>
}

export default {
  async queue(batch: MessageBatch<MessageBody>, env: Env): Promise<void> {
    for (const msg of batch.messages) {
      console.log(msg.body.action)
      msg.ack()
    }
  },
} satisfies ExportedHandler<Env>
```

## 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
```
