[英]GDAX API - Rate limit exceeded
当我尝试从GDAX请求历史数据时,收到一条错误消息“超出速率限制”。 我使用promise和setInterval从GDAX请求历史价格数据,如下所示:
let promiseArray = //Array with promises
let j = 0;
let grabPrices = setInterval(() => {
if (j === promiseArray.length) {
//Do something when all promises have been resolved
}
else {
promiseArray[j].then(
data => {
//Work with data
}
).catch(error => console.log('An error occurred: ' + error));
j++;
}
}, 1000) //I have even tried to use 10 seconds (10000) as a second argument to setInterval, but it doesn't make any difference.
速率限制超过速率限制时,将返回429个请求过多的状态。
REST API公共端点我们通过IP限制公共端点:每秒3个请求,每秒最多6个请求。
当您有一个Promise时,该请求已经发出,因此您的promiseArray是一个正在进行的请求的数组。
假设我有一个网址数组,并使用fetch
来获取内容。 使用map
将URL映射到一个Promise.all
数组提供给Promise.all
:
Promise.all(
urls.map(fetch)
).then(
resulst=>...
);
如果网址有10个项目,则此程序将立即发出10个请求。
您可以将fetch
函数传递给节流函数,该函数将以每秒仅调用3次的方式调度获取。 节流功能将返回一个Promise,但不会立即调用fetch。
节流阀功能可以在这里找到。 如果您只打算从该模块复制粘贴代码而不导入整个模块,那么您还需要后面的函数,因为节流阀取决于它。
const fetchMaxThreePerSecond = throttlePeriod(3,1100)/*give it an extra 100*/(fetch)
Promise.all(
urls.map(fetchMaxThreePerSecond)
).then(
resulst=>...
);
这可以解决节流问题,但是如果您知道Promise.all
工作原理,那么您就会知道,只有一个拒绝,所有的Promise.all
都会被拒绝。 因此,如果您有100个网址和99个解析地址,但其中一个拒绝了您的.then
不会被调用。 您将丢失99个成功的请求。
您可以将一个承诺传递给Promise.all
所有不会拒绝的承诺都可以通过捕获被拒绝的承诺来实现,并在catch中返回一个特殊的值,您可以在处理结果时过滤掉该值:
const fetchMaxThreePerSecond = throttlePeriod(3,1100)/*give it an extra 100*/(fetch);
const Fail = function(reason){this.reason = reason;};
const isFail = x=>(x&&x.constructor)===Fail;
const isNotFail = x=>!isFail(x);
Promise.all(
urls.map(
url=>
fetchMaxThreePerSecond(url)
.catch(e=>new Fail([url,e]))//save url and error in Fail object
)
)
.then(//even if a request fails, it will not reject
results=>{
const successes = results.filter(isNotFail);
const failed = results.filter(isFail);
if(failed.length!==0){
console.log("some requests failed:");
failed.forEach(
(fail)=>{
const [url,error] = fail.reason;
console.log(`Url: ${url}`);
console.log(JSON.stringify(error,undefined,2));
}
)
}
}
);
将速率限制器设置为每2.1秒3个API调用时,GDAX历史记录调用没有问题。
当我将速率限制器设置为每1.8秒3个API调用时,偶尔会遇到一些问题。
我已经用自动化测试测试了这些值。
重要提示:我对GDAX的所有呼叫均使用相同的速率限制器(!)
为保存起见,请使用@HMR答案中的代码以及我测试过的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.