rabbitmq 即使在遵循最佳实践后,仍持续达到GitHub二级速率限制?

kokeuurv  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(165)

在我的应用程序中,我使用令牌向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);
    }
};

示例体系结构:
一个查询字符串(来自一个查询字符串列表)和适当的令牌被插入到rabbitmq x延迟队列中,每个消息的延迟为index*2000s(因此它们之间的间隔为2s),上面的函数是该队列的消费者。当消费者抛出错误时,消息被否定并发送到死信队列。

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 }
    })
})
ktca8awb

ktca8awb1#

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

ego6inou

ego6inou2#

您将休眠时间硬编码为2s,但是根据文档,当您触发辅助API速率限制时,您必须等待与响应报头的Retry-After属性中指示的时间相同的时间。

相关问题