Cloudflare Queues 的并发和限额怎么设?

Queues 的 push 消费者默认是自动扩缩的,并发调用数的上限是 250。限制并发并不能省钱,只会换来更高的延迟。

所以答案是:默认不要设 max_concurrency,只在下游扛不住高并发时才设,用它来保护下游,而不是省钱。 消息体、批量和吞吐也各有上限,超过的会被拒绝,大载荷应该放进 R2,消息里只传引用。

下面先讲并发是怎么决定的,再讲积压和各项限额。

默认的并发是怎么决定的?

官方文档说,Queues 在每个批次结束后,根据积压的大小与增长速度、失败调用与成功调用的比例,以及你设置的 max_concurrency,决定增减并发调用数,上限 250。

有两点容易忽略。只有处理器抛出未捕获异常才算“失败调用”,显式 retry() 不计入。并发越高,总成本大致不变,只是更快处理完。

什么时候该设 max_concurrency?

只在下游有明确的承载上限时设,比如第三方 API 有速率限制。官方建议不设,除非下游扛不住。这时把并发压到 1 到 5,并接受更大的积压。

如果只是想省钱而压低并发,成本不会明显下降,只是消息排得更久。

消息会在队列里放多久?

积压不是无限的。Paid 的消息保留期默认 4 天,可以配到最长 14 天;Free 固定 24 小时;队列积压上限 25 GB。

消费者长期落后时,消息会在被处理之前过期。这种问题不会报错,要靠监控积压量发现。

单条消息和单个队列有哪些上限?

官方限额页给的数字:

  • 消息体最大 128 KB。
  • sendBatch 最多 100 条或 256 KB。
  • 单队列吞吐 5000 条/秒,超出会抛 Too Many Requests。
  • 消费者 wall clock 15 分钟,CPU 默认 30 秒,可配到 5 分钟。

我在本地试了几个边界:sendBatch 100 条成功,101 条被拒绝;超过 128 KB 的消息被拒绝;delaySeconds 超过 24 小时也被拒绝。本地的错误信息只是笼统的 Unknown Internal Error,看到它别以为是别的故障。吞吐和积压上限我没有在本地验证。

载荷太大怎么办?

放进 R2,消息里只传引用。单条消息处理太久也是同类问题:更长的流程应该拆分,或者交给 Workflows。

消息重试和死信的配置见 Cloudflare Queues 消息处理失败后会怎样?,限额清单以 Queues 限制(官方) 为准。

消息体、sendBatch 的 100 条上限,以及超 24 小时的 delaySeconds 被拒绝,我在本地 wrangler dev 里跑过。自动扩缩的依据、并发上限 250、保留期、积压上限、吞吐上限和消费者的时间限制,都是官方文档的说法,我没有验证,线上的吞吐与计费本地也无法复现。限额与默认值会变化,以官方文档为准。