即使遵循最佳实践,仍持续触及 GitHub 二级速率限制?

问题描述 投票:0回答:3

在我的应用程序中,我使用令牌向 GitHub 搜索 API 发出经过身份验证的请求。我每 2 秒发出一次请求,以保持在每分钟 30 个请求的主要速率限制内(因此不是同时进行),并且在进行实际的搜索 API 调用之前,我还会使用 GitHub 速率限制 API 验证每个请求。

即使在罕见的意外并发请求的情况下,它们也不太可能是针对同一个令牌。

我似乎遵循主要和次要最佳实践文档中提到的所有规则。尽管如此,我的应用程序仍然受到二级速率限制,我不知道为什么。谁能帮我解释为什么会发生这种情况?

编辑:

示例代码:

const search = async function(query, token) {
    var limitResponse;
    try {
        limitResponse = JSON.parse(await rp({
            uri: "https://api.github.com/rate_limit",
            headers: {
                'User-Agent': 'Request-Promise',
                'Authorization': 'token ' + token
            },
            timeout: 20000
        }));
    } catch (e) {
        logger.error("error while fetching rate limit from github", token);
        throw new Error(Codes.INTERNAL_SERVER_ERROR);
    }
    if (limitResponse.resources.search.remaining === 0) {
        logger.error("github rate limit reached to zero");
        throw new Error(Codes.INTERNAL_SERVER_ERROR);
    }
    try {
        var result = JSON.parse(await rp({
            uri: "https://api.github.com/search/code",
            qs: {
                q: query,
                page: 1,
                per_page: 50
            },
            headers: {
                'User-Agent': 'Request-Promise',
                'Authorization': 'token ' + token
            },
            timeout: 20000
        }));
        logger.info("successfully fetched data from github", token);
        /// process response
    } catch (e) {
        logger.error("error while fetching data from github" token);
        throw new Error(Codes.INTERNAL_SERVER_ERROR);
    }
};

示例架构:

查询字符串(来自查询字符串列表)和用于进行 API 调用的适当令牌被插入到rabbitmq x延迟队列中,每条消息的延迟为索引*2000秒(因此它们间隔2秒)上面的函数是该队列的消费者。当消费者抛出错误时,消息将被 nack 并发送到死信队列。

const { delayBetweenMessages } = require('../rmq/queue_registry').GITHUB_SEARCH;
await __.asyncForEach(queries, async (query, index) => {
    await rmqManager.publish(require('../rmq/queue_registry').GITHUB_SEARCH, query, {
            headers: { 'x-delay': index * delayBetweenMessages }
    })
})
node.js rest github rabbitmq github-api
3个回答
32
投票

看起来您的代码没有问题。我只是在浏览器中冲浪并使用 github 搜索栏,并且仅通过浏览就达到了浏览器的二级速率限制。所以,看起来搜索 API 在内部使用并发性。所以,可能是 github 自己的 bug。


3
投票

您硬编码了 2 秒的睡眠时间,但是,根据文档,当您触发辅助 api 速率限制时,您必须等待与响应标头的

Retry-After
属性中指示的时间相同的时间。


0
投票

登录以删除较低的速率限制值。

  • 未经身份验证的用户:60 rph
  • 授权用户: 5000 rph

来源:https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api?apiVersion=2022-11-28#primary-rate-未经身份验证的用户限制

© www.soinside.com 2019 - 2024. All rights reserved.