为什么选择基于复杂度的速率限制?
传统REST API使用基于请求的速率限制,其中每个请求消耗相同的额度,无论您获取一个字段还是数百个字段,也无论您读取还是修改数据—尽管这在服务器负载方面有巨大差异。
GraphQL的查询复杂度方法通过根据实际请求的数据和执行的操作计算成本来解决这个问题。这让您可以更灵活地请求所需的内容,同时提供可预测的服务器负载。
速率限制
Zonos使用一个基于点数的系统,其中每个查询根据其复杂度扣减点数。您有一个可用点数池,其中:
- 以3,000点每秒的速度补充(10秒内30,000点)
- 最大容量为300,000点
这允许您偶尔发送复杂查询的突发请求,同时保持可持续的请求速度。
查询成本如何计算
每个GraphQL请求都有一个在执行前计算的成本:
基础成本
- **查询:**5点
- **变更:**10点
- **对象:**每个返回的对象1点
- **标量字段:**0点(免费)
字符串、整数、ID和布尔值等标量字段不会增加成本。您只需支付基础操作和返回对象的费用。
示例:简单查询
query { landedCost(id: "123") { id createdBy shipToCountry }}**成本分解:**5(基础查询)+ 1(Landed Cost 对象)= 6点
标量字段(id、name、currency)是免费的。
示例:包含多个对象的查询
{ orders(first: 10, filter: { status: COMPLETED }) { edges { cursor node { id } } }}**成本分解:**5(基础查询)+ 10(10个订单 × 每个1点)= 15点
示例:变更
mutation { landedCostCalculate(input: { ... }) { id }}**成本分解:**10(基础变更)+ 约50(返回的对象)= 60点
典型的 Landed Cost 计算成本约为60点复杂度。
查看查询复杂度
每个API响应都包括一个zonos-query-complexity标头,显示您查询的成本:
zonos-query-complexity: 58此标头告诉您查询消耗了多少个点。使用它来监控您的API使用情况并优化昂贵的查询。
处理速率限制
如果您超过速率限制,您会收到一条错误消息。要有效处理速率限制:
监控您的复杂度
检查响应中的zonos-query-complexity标头,以了解您的查询成本并识别昂贵的模式。
实施重试逻辑
如果您触及速率限制,请实施指数退避和重试逻辑。由于桶以3,000点每秒的速度补充,请根据您的查询复杂度计算适当的等待时间。
高效批处理
GraphQL允许您在单个请求中请求多个查询:
{ landedCost(id: "landed_cost_123") { id createdAt } order(orderId: "order_123") { id status createdAt }}最佳实践
仅请求您需要的内容
查询复杂度与您请求的数据成正比。构造您的查询以仅获取您实际使用的字段和对象。
query { order(orderId: "order_123") { id status createdAt updatedAt items { id name quantity amount } shipments { id } }}对大型数据集进行分页
请求多个对象时,使用合理的页面大小:
{ orders(first: 100, filter: { status: COMPLETED }) { edges { cursor node { id } } }}每次请求10-50个项目并根据需要逐页浏览结果,而不是在单个查询中请求数百个对象。
避免不必要的嵌套
每个嵌套对象都会增加您的复杂度。仅在您实际需要嵌套数据时才请求它。
GraphQL API速率限制
了解Zonos如何根据复杂度计算查询成本。
Zonos基于查询复杂度而非请求数量来对GraphQL API请求进行速率限制。这确保了公平的使用,同时允许您精确请求所需的数据。