GDAX API - 速率限制超过

时间:2018-02-03 03:16:41

标签: javascript api gdax-api

我收到一条错误消息"超出了费率限制"当我尝试从GDAX请求历史数据时。我使用promises和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.

来自official API documentation

速率限制 超过速率限制时,将返回429 Too Many Requests的状态。

REST API 公共端点 我们通过IP限制公共端点:每秒3个请求,每秒最多6个请求。

2 个答案:

答案 0 :(得分:1)

如果你有一个承诺,那么请求已经发出,所以你的promiseArray是一系列正在进行的请求。

假设我有一系列网址并使用fetch来获取内容。使用map将网址映射到承诺并将承诺数组提供给Promise.all

Promise.all(
  urls.map(fetch)
).then(
  resulst=>...
);

如果网址有10个项目,此程序将立即发出10个请求。

您可以将fetch函数传递给一个限制函数,该函数将以每秒3次调用的方式调度获取。油门功能将返回一个承诺,但不会立即调用fetch。

可以找到throttlePeriod函数here。如果您只是要从该模块复制粘贴代码而不导入整个模块,那么您还需要later函数,因为throttlePeriod依赖于它。

const fetchMaxThreePerSecond = throttlePeriod(3,1100)/*give it an extra 100*/(fetch)
Promise.all(
  urls.map(fetchMaxThreePerSecond)
).then(
  resulst=>...
);

负责限制,但如果你知道Promise.all如何运作,你知道如果只有一个拒绝,所有的承诺都会被拒绝。因此,如果你有一百个网址和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));
        }
      )
    }
  }
); 

答案 1 :(得分:0)

当我将速率限制器设置为每2.1秒3个API调用时,我对GDAX历史记录调用没有任何问题。

当我每隔1.8秒将速率限制器设置为3个API调用时,我偶尔会遇到一些问题。

我已使用自动化测试测试了这些值。

重要提示:我对GDAX的所有电话共享相同的速率限制器(!)

要保存,请使用@ HMR的答案中的代码以及我测试的参数。