gpt4 book ai didi

Node.js - 限制我发出的请求数量

转载 作者:太空宇宙 更新时间:2023-11-04 00:10:02 25 4
gpt4 key购买 nike

我有一个 Node 应用程序,其中有一个 Gremlin 客户端:

var Gremlin = require('gremlin');

const client = Gremlin.createClient(
443,
config.endpoint,
{
"session": false,
"ssl": true,
"user": `/dbs/${config.database}/colls/${config.collection}`,
"password": config.primaryKey
}
);

然后我使用以下方法调用 CosmoDB 以添加一些记录:

async.forEach(pData, function (data, innercallback) {
if (data.type == 'Full'){
client.execute("g.addV('test').property('id', \"" + data.$.id + "\")", {}, innercallback);
} else {
innercallback(null);
}
}, outercallback);

但是在我的 Azure 端,每秒有 400 个请求的限制,随后我收到错误:

ExceptionType : RequestRateTooLargeException
ExceptionMessage : Message: {"Errors":["Request rate is large"]}

有谁知道如何限制每秒发出的请求数量,而无需在 Azure 上进行扩展(因为这会花费更多:))

另外:

我尝试使用

async.forEachLimit(pData, 400, function (data, innercallback) {
if (data.type == 'Full'){
client.execute("g.addV('test').property('id', \"" + data.$.id + "\")", {}, innercallback);
} else {
innercallback(null);
}
}, outercallback);

但是,如果继续看到RangeError:超过最大调用堆栈大小(如果它太高),否则如果我减少,我只会得到相同的请求率太大异常。

谢谢。

最佳答案

RangeError: Maximum call stack size exceeded

可能会发生这种情况,因为 innercallbackelse 情况下是同步调用的。应该是:

} else {
process.nextTick(function() {
innercallback(null)
});
}

forEachLimit 的调用看起来通常是正确的,但您需要确保当真正触发请求时(if block ),innercallback 不会早于 1 秒调用,以保证一秒内触发的请求不超过 400 个。最简单的是将回调执行延迟 1 秒:

client.execute("g.addV('test').property('id', \"" + data.$.id + "\")", {},
function(err) {
setTimeout(function() { innercallback(err); }, 1000);
});

更准确的解决方案是计算实际的请求+响应时间,并仅针对剩余时间 1 秒进行 setTimeout

作为进一步的改进,看起来您可以在执行异步操作之前过滤 pData 数组以摆脱 if...else,所以最终:

var pDataFull = pData.filter(function(data) => {
return data.type == 'Full';
});

async.forEachLimit(pDataFull, 400, function (data, innercallback) {
client.execute("g.addV('test').property('id', \"" + data.$.id +
"\")", {},
function(err) {
setTimeout(function() { innercallback(err); }, 1000);
}
);
}, outercallback);

关于Node.js - 限制我发出的请求数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50227730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com