Shopify API速率限制
为了确保我们的平台对所有人保持稳定和公平,所有Shopify api都是有价格限制的。我们使用多种策略来实施费率限制。我们要求开发人员使用行业标准技术用于限制调用、缓存结果和负责任地重新尝试请求。
比较API的速率限制
链接到标题为“比较API的速率限制”的部分Shopify api使用几种不同的病原的方法.下面将详细描述这些数据,以下是关键数据:
漏桶算法
链接到标题为“漏桶算法”的部分所有的Shopify api使用漏桶算法管理请求。这种算法可以让你的应用程序在一段时间内以不频繁的爆发方式发出无限量的请求。
理解漏桶比喻的要点如下:
- 每个应用程序都可以访问一个bucket。它能装60个“弹珠”。
- 每秒钟,一个弹珠从桶中移出(如果有的话)。这样总是有更多的空间。
- 每个API请求都要求您向桶中投掷一个弹珠。
- 如果存储桶满了,您将得到一个错误,并且必须等待存储桶中的可用空间。
这个模型确保负责管理API调用的应用程序在它们的桶中总是有空间来发出大量的请求。例如,如果你平均每秒20个请求(“弹珠”),但突然需要同时发出30个请求,你仍然可以这样做而不会达到速率限制。
漏桶算法的基本原理适用于我们所有的速率限制,不管具体的方法用来应用它们。
限速方法
链接到标题为“速率限制方法”的部分Shopify使用三种不同的方法来管理费率限制。不同的api根据用例使用不同的方法,所以确保你了解你的应用程序将遇到的各种类型的速率限制:
Request-based限制
指向“基于请求的限制”部分的链接应用程序可以最大化数量每分钟的请求数。例如:60秒内40个API请求。无论返回多少数据,每个请求都是相等的。
REST Admin API使用此方法。
基于时间的限制
指向“基于时间的限制”部分的链接应用程序可以发出最大量的请求时间每分钟。例如:60秒内120个请求,每个请求需要0.5秒返回。更复杂的请求需要更长的时间,因此占限制的比例更大。
此方法由Storefront API使用。
计算的查询成本
链接到标题为“计算查询成本”的部分应用程序可以发出花费最大数量的请求点每分钟。例如:60秒内获得1000分。更复杂的请求花费更多的点数,因此占限制的比例更大。
GraphQL API使用这个方法
GraphQL管理API速率限制
标题为“GraphQL管理API速率限制”的部分的锚链接对GraphQL Admin API的调用是有限的计算的查询成本,这意味着你应该考虑成本的请求,而不是数量的请求。
GraphQL Admin 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 Admin API的调用由request-based限制,这意味着你应该考虑总数数量的API调用。此外,还有基于资源的速率限制和节流。
REST Admin API速率限制是基于应用程序和商店的组合。这意味着来自一个应用程序的呼叫不会影响另一个应用程序的速率限制,即使是在同一个商店。类似地,呼叫一个商店不会影响另一个商店的速率限制,即使是从同一个应用程序。
使用漏桶算法计算极限。超过速率限制后发出的所有请求都将被限制,并使用HTTP请求太多
返回错误。在桶中清空了足够多的请求后,请求再次成功。您可以使用rate limits报头查看存储的节流阀的当前状态。
的桶的大小而且泄漏率属性决定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
请求,然后在等待十秒后,显示报头19/40
请求。
Retry-After头
指向标题为“重试后报头”部分的锚定链接当请求超过速率限制时,将调用请求太多
错误和Retry-After
返回头文件。的Retry-After
头包含等待的秒数,直到您可以再次发出请求。在等待时间结束之前发出的任何请求都将被限制。
店面API速率限制
指向“店面API速率限制”部分的链接Storefront API可扩展以支持所有规模的销售。
对Storefront API的调用由基于时间的限制,这意味着你应该考虑时间你的请求拿去完成,而不是拿去数量的请求。
基于时间的限制适用于请求的IP地址,而不是应用程序本身。你的应用程序不会因为买家流量的增加而受到限制,因为向店面发出请求的唯一客户的数量没有限制。基于时间的限制还可以保护您的店面不受单个用户(例如机器人)消耗大量容量的影响。
的桶的大小而且泄漏率属性决定API的突发行为和请求速率。默认设置如下:
- 桶的大小:
60秒/app/IP地址
- 泄漏率:
1 /秒
对Storefront API的每个请求至少花费0.5秒来运行。请求完成后,计算总消耗时间并从桶中减去。
桶限制示例
链接到标题为“桶限制示例”的部分假设当用户加载你的应用程序时,客户端发出了几个并行的API请求:
- 20个简单的查询,每个查询耗时0.5秒或更短
- 15个更复杂的查询,每个查询需要1秒
- 10个高度复杂的查询,每个查询需要2秒
总花费将是:(20⨉0.5)+(15⨉1.0)+(10⨉2.0)= 45秒。
在这种情况下,您仍然有15秒的查询可用。
Checkout-level节流
链接到标题为“结账级油门”的部分Shopify限制了每分钟可以在Storefront API上创建的结帐数量。如果API客户端超过了这个限制,那么200年压制
返回错误响应。Shopify建议设计应用程序时要适应这种情况。例如,可以使用指数回退算法实现请求队列。
最大输入数组大小限制
链接到标题为“最大输入数组大小限制”的部分接受数组的输入参数的最大大小为250。如果输入数组超过250个项,查询和突变将返回错误。
基于资源的速率限制
链接到标题为“基于资源的速率限制”的部分在GraphQL和REST版本中,以下管理API资源都有一个额外的限制,当存储有50,000个产品变体时生效。在达到这个阈值之后,每天可以创建的新变体不超过1000个。
在某些情况下,Shopify需要执行费率限制,以防止滥用平台。因此,你的应用程序应该准备好处理所有端点上的速率限制,而不仅仅是这里列出的那些。
GraphQL突变
指向“GraphQL突变”部分的链接REST端点
指向“REST端点”部分的锚定链接如果一个应用程序达到了特定资源的API速率限制,那么它会收到一个请求太多
响应,以及已应用节流阀的消息。
避免速率限制错误
链接到标题为“避免速率限制错误”的部分在设计应用时牢记最佳实践是避免节流错误的最佳方法。例如,您可以在队列中错开API请求,并在等待下一个队列作业运行时执行其他处理任务。在设计应用程序时,考虑以下最佳实践:
- 优化代码,使其只获得应用程序所需的数据。
- 对应用程序经常使用的数据使用缓存。
- 调节请求的速率,以便更顺利地分发。
- 包含捕获错误的代码。如果你忽略这些错误并继续尝试发出请求,那么你的应用程序将无法优雅地恢复。
- 使用关于应用程序的API使用情况的元数据,包括所有API响应,来动态管理应用程序的行为。
- 您的代码应该停止发出额外的API请求,直到有足够的时间进行重试。建议回退时间为1秒。