Shopify API速率限制
为了确保我们的平台对每个人都保持稳定和公平,一些Shopify api是限速的。我们使用各种策略来执行速率限制。我们要求开发人员使用工业标准技术用于限制调用、缓存结果和负责任地重试请求。
按API比较速率限制
锚点链接到标题为“按API比较费率限制”的部分Shopify api使用了几种不同的病原的方法.下面将更详细地描述它们,但以下是关键数据:
漏桶算法
锚点链接到题为“漏桶算法”的部分所有Shopify api都使用a漏桶算法管理请求。这个算法可以让你的应用程序在不频繁的突发时间内发出无限量的请求。
关于“漏桶”比喻,需要理解的要点如下:
- 每个应用程序都可以访问一个bucket。它可以装60颗弹珠。
- 每秒钟,一个弹珠从桶中取出(如果有的话)。这样就会有更多的空间。
- 每个API请求都需要你把一个弹珠扔进桶里。
- 如果存储桶已满,您将得到一个错误,并且必须等待存储桶中有可用的空间。
该模型确保负责管理API调用的应用程序总是有空间在需要时发出突发请求。例如,如果您平均每秒20个请求(“弹珠”),但突然需要同时发出30个请求,您仍然可以在不达到速率限制的情况下这样做。
漏桶算法的基本原理适用于我们所有的速率限制,无论具体的方法用来应用它们。
速率限制方法
锚点链接到标题为“速率限制方法”的部分Shopify使用两种不同的方法来管理费率限制。不同的api根据使用情况使用不同的方法,所以确保你了解应用可能遇到的各种类型的速率限制:
Request-based限制
锚点链接到标题为“基于请求的限制”的部分应用程序可以达到最大值数量每分钟的请求数。例如:60秒内40个API请求。无论返回多少数据,每个请求的计数都是相等的。
此方法由REST管理API使用。
计算查询成本
锚点链接到标题为“计算查询成本”的部分应用程序可以发出花费最大数量的请求点每分钟。例如:60秒内1000分。更复杂的请求花费更多的分数,因此在限制中所占的比例更大。
GraphQL API使用该方法
GraphQL管理API速率限制
锚点链接到标题为“GraphQL管理API速率限制”的部分对GraphQL管理API的调用受到以下限制计算查询成本,这意味着你应该考虑成本的请求,而不是数量的请求。
GraphQL管理API速率限制是基于应用程序和商店的组合。这意味着来自一个应用程序的调用不会影响另一个应用程序的速率限制,即使在同一个商店。同样,调用一个商店不会影响另一个商店的速率限制,即使是来自同一个应用程序。
应用程序和商店的每个组合都有1000个成本点,泄漏率为每秒50个成本点。这意味着你的查询的总成本在任何给定时间都不能超过1000分,这个空间以每秒50分的速度在应用程序的存储桶中创建。通过创建更简单、低成本的查询,您可以创建更多的查询。
该限制使用请求和实际查询成本的组合。在执行开始之前,应用程序的存储桶必须有足够的空间来处理请求的查询开销。执行完成后,将向bucket退还请求成本与查询实际成本之间的差额。
成本核算
锚点链接到标题为“成本计算”的部分模式中的每个字段都有一个分配给它的整数成本值。查询的开销是每个字段开销的总和。运行查询是了解查询真实成本的最佳方式。
默认情况下,字段的成本是基于字段返回的内容:
字段返回 | 成本价值 |
---|---|
标量 | 0 |
枚举 | 0 |
对象 | 1 |
接口 | 1 |
联盟 | 1 |
虽然这些默认成本是存在的,但Shopify也保留在字段上设置手动成本的权利。
要求和实际成本
锚链接到标题为“要求和实际成本”的部分Shopify在查询执行之前和之后都计算查询的成本。请求的成本基于请求的字段数。实际成本是基于返回的结果,因为由于对象类型字段返回null,或者连接字段返回的边比请求的少,查询可能提前结束。
单次查询限制
锚点链接到标题为“单次查询限制”的部分对API的单个查询的开销不能超过1,000。在执行查询之前,根据查询请求的成本强制执行此限制。
最大输入数组大小限制
锚点链接到标题为"最大输入数组大小限制"的部分接受数组的输入参数的最大大小为250。如果输入数组超过250项,查询和更改将返回错误。
GraphQL响应
锚点链接到标题为“GraphQL响应”的部分响应包括有关请求成本和油门状态的信息。下返回该数据扩展
关键:
要获得每个字段对所请求成本的贡献情况的详细细分,可以包括标题“X-GraphQL-Cost-Include-Fields”:真的
在你的请求中。
批量操作
锚点链接到标题为“批量操作”的部分要查询和获取大量数据,应该使用批量操作而不是单个查询。批量操作是为处理大量数据而设计的,它们没有单个查询所具有的最大成本限制或速率限制。
REST管理API速率限制
锚点链接到标题为“REST管理API速率限制”的部分对REST管理API的调用由request-based限制,这意味着你应该考虑总数数量你的应用调用了多少个API。此外,还有基于资源的速率限制和节流。
REST管理API速率限制是基于应用程序和商店的组合。这意味着来自一个应用程序的调用不会影响另一个应用程序的速率限制,即使在同一个商店。同样,调用一个商店不会影响另一个商店的速率限制,即使是来自同一个应用程序。
使用漏桶算法计算限制。在超过速率限制之后发出的所有请求都将被限制,并使用HTTP请求太多
返回错误。在足够的请求从桶中清空后,请求再次成功。您可以使用速率限制标头查看存储的节流当前状态。
的桶的大小和泄漏率属性决定API的突发行为和请求速率。
默认设置如下:
- 桶的大小:
40 / app /存储的请求
- 泄漏率:
2 /秒
如果超出桶大小,则HTTP请求太多
返回错误。桶以每秒两个请求的泄漏率清空。为了避免被限制,你可以将你的应用程序构建为平均每秒两个请求。节流是一个通过或失败的操作。如果bucket中有可用容量,则执行请求时不会排队或处理延迟。否则,请求将被限制。
对于GET请求还有一个额外的速率限制。的值页面
参数导致所请求资源的偏移量超过100,000请求太多
返回错误。例如,请求/管理/ collects.json吗?限制= 250和页面= 401
将生成100,250 (250 x 401 = 100,250)的偏移量并返回429响应。
速率限制标头
锚点链接到标题为“速率限制页眉”的部分你可以使用Shopify查看你已经发出了多少请求X-Shopify-Shop-Api-Call-Limit
响应您的API请求而发送的头。这个标头列出了您为特定商店发出的请求的数量。例如:
在这个例子中,32
当前请求计数和40
是桶的大小。随着时间的推移,请求计数会根据泄漏率减少。例如,如果标题显示39/40
请求,然后在等待10秒后,显示报头19/40
请求。
Retry-After头
锚点链接到标题为“Retry-After header”的部分当请求超过速率限制时,a请求太多
错误和aRetry-After
头返回。的Retry-After
头包含等待的秒数,直到您可以再次发出请求。在等待时间过去之前发出的任何请求都将被限制。
店面API率限制
锚定链接到标题为“店面API费率限制”的部分Storefront API旨在支持各种规模的企业。Storefront API将扩展以支持买家流量激增或最大的闪购。对可以向API发出的请求数量没有速率限制。
Storefront API提供了防止恶意用户(如bot)消耗高容量的保护。如果一个请求看起来是恶意的,Shopify将回复一个430 Shopify安全拒绝
错误代码指出潜在的安全问题。确保对Storefront API的请求包含正确的买方IP报头.
Checkout-level节流
锚定链接到标题为“结帐级节流”的部分Shopify限制了每分钟可以在Storefront API上创建的结帐数量。如果API客户端超过了这个限制,那么200年压制
返回错误响应。Shopify建议设计应用程序以适应这种情况。例如,您可以使用指数回退算法实现请求队列。
最大输入数组大小限制
锚点链接到标题为"最大输入数组大小限制"的部分接受数组的输入参数的最大大小为250。如果输入数组超过250项,查询和更改将返回错误。
基于资源的费率限制
锚定链接到标题为“基于资源的费率限制”的部分以下GraphQL和REST版本中的Admin API资源有一个额外的限制,当一个商店有50,000个产品变体时生效。在达到这个阈值之后,每天创建的新变体不能超过1000个。
在某些情况下,Shopify需要强制执行速率限制,以防止滥用平台。因此,你的应用程序应该准备好处理所有端点的速率限制,而不仅仅是这里列出的那些。
GraphQL突变
链接到标题为“GraphQL突变”的部分REST端点
锚点链接到标题为“REST端点”的部分如果应用程序达到特定资源的API速率限制,那么它将收到一个请求太多
响应,并显示已应用油门的消息。
避免速率限制错误
锚点链接到标题为“避免速率限制错误”的部分在设计应用时牢记最佳实践是避免节流错误的最佳方法。例如,您可以在队列中错开API请求,并在等待下一个队列作业运行时执行其他处理任务。在设计应用程序时,请考虑以下最佳实践:
- 优化代码,只获取应用程序所需的数据。
- 对应用程序经常使用的数据使用缓存。
- 调节请求的速率,使分发更顺畅。
- 包括捕获错误的代码。如果你忽略这些错误并继续尝试请求,那么你的应用程序将无法优雅地恢复。
- 使用有关应用程序API使用情况的元数据(包含在所有API响应中)来动态管理应用程序的行为。
- 您的代码应该停止发出额外的API请求,直到有足够的时间进行重试。建议后退时间为1秒。