我正在使用mikeal/request进行API调用。这是我最常用的API之一(即Shopify API)。最近推出了一个新的call limit,我看到如下错误:
Exceeded 6.0 calls per second for api client. Slow your requests or contact support for higher limits.
我已经升级了,但是不管我得到了多少带宽,我都必须考虑到这一点。对Shopify API的大多数请求都在async.map()函数中,这些函数循环异步请求,并收集主体。
我正在寻找任何帮助,也许是一个已经存在的库,它将包裹请求模块,并实际上阻止、休眠、节流、分配、管理异步发出的许多同时请求,并将它们限制为一次6
请求。如果这样的项目不存在,我对工作没有问题。我只是不知道如何处理这种情况。我希望能有个标准。
我用mikeal/request做了一张票。
9条答案
按热度按时间jogvjijk1#
对于另一种解决方案,我使用node-rate-limiter来 Package request函数,如下所示:
zdwk9cvp2#
npm
包simple-rate-limiter似乎是这个问题的一个非常好的解决方案。而且,它比
node-rate-limiter
和async.queue
更容易使用。下面的代码片段展示了如何将所有请求限制为每秒10个。
zfycwa2u3#
我在各种API中都遇到过同样的问题。AWS也以节流而闻名。
可以使用两种方法。您提到了async.map()函数。您尝试过async.queue()吗?queue方法应该允许您设置一个固定的限制(如6),超过该限制的任何内容都将被放入队列中。
另一个有用的工具是oibackoff,如果从服务器返回错误,该库将允许您回退请求,然后重试。
Package 这两个库以确保覆盖两个库是很有用的:async.queue确保您不会超过限制,oibackoff确保您在服务器告诉您有错误时获得另一次请求机会。
4sup72z84#
我的解决方案使用现代香草JS:
mwecs4sa5#
在异步模块中,此请求的功能关闭为“无法修复”
有一种解决方案使用leakybucket或token bucket模型,它被实现为RateLimiter的“限制器”npm模块。
RateLimiter
,请参阅此处的示例:https://github.com/caolan/async/issues/1314#issuecomment-263715550另一种方式是使用**
PromiseThrottle
**,我使用了这个,工作示例如下:输出量:
我们可以从输出中清楚地看到速率,即每秒5次调用。
5q4ezhmt6#
其他的解决方案并不符合我的口味。进一步研究,我发现promise-ratelimit,它给你一个API,你可以简单地
await
:上面的示例将确保您最多每2000ms对
api.example.com
进行一次查询。换句话说,第一个请求不会**等待2000ms。uubf1zoe7#
下面是我的解决方案,使用一个库
request-promise
或axios
,并将调用 Package 在这个promise中。hgtggwj08#
我使用async-sema模块处理节流HTTP请求。这意味着它允许你发送带有速率限制的HTTP请求。
以下是一个示例:
一个简单的Node.js服务器,在API中添加
express-rate-limit
中间件,使API具有限速功能。server.ts
:在客户端,**我们希望发送并发数为3的HTTP请求,并且请求之间的每秒上限为3。**我将客户端代码放在了一个测试用例中。所以不要觉得奇怪。
server.test.ts
:测试结果,注意时间的要求
iovurdzv9#
这里有这么多很棒的选择,这里也是我在我的一个项目中使用的一个。
axios-request-throttle
用法: