【发布时间】:2022-07-29 19:38:35
【问题描述】:
我有一个应用程序需要很长时间才能处理发布请求。 如果客户端在短时间内(比如 5 秒)发送超过 6 个请求,我会得到一些意想不到的行为。
例如: 服务器端
app.options('/',cors({origin: "http://localhost:5050"}));
app.post('/',cors({origin: "http://localhost:5050"}),async(req,res) => {
console.log(Date.now());
await new Promise(resolve => setTimeout(resolve, 5000));
console.log("----complete----")
res.send("Success");
})
客户端:
$.ajax ({
url: "http://127.0.0.1:5050/",
type: "POST",
data: JSON.stringify({token:"62e2c285a01937cdb462985d"}),
contentType: "application/json; charset=utf-8"
}).done(function(result,status,xhr){
console.log("done");}
如果客户端在 5 秒内发出超过 7 个请求,您将获得以下输出(服务器端) 输出(自纪元以来的毫秒数):
1659038307446
1659038307703
1659038307985
1659038308260
1659038308528
1659038308818
----complete----
1659038312459
----complete----
1659038312712
----complete----
1659038312994
----complete----
1659038313266
----complete----
----complete----
----complete----
----complete----
----complete----
----complete----
如您所见,前 6 次记录的时间间隔约为 0.3 秒(这是我单击浏览器上的按钮启动请求的速度),但第 6 次和第 7 次记录的时间间隔约为 5 秒。我本来希望所有记录的时间间隔 0.3 秒。显然节点在开始处理第 7 个请求之前正在等待完成第 1 个请求。
为什么会发生这种情况,为什么限制为 6,并且无论如何要覆盖这种行为?
编辑:
我发现在一个浏览器上发出超过 6 个请求后,切换到另一个浏览器并再发出 6 个请求。来自其他浏览器的这些请求会立即得到处理。这不会发生在单独的选项卡上。仅在不同的浏览器上。我由此推断 express 必须通过检查客户端的 ip 和端口或通过其他方式识别客户端来实现某种速率限制。
【问题讨论】:
-
@HugoDos 谢谢你的推荐。我发现它很有用,但仍然无法回答我自己的问题。阅读后我最初认为 express/node 一次服务 6 条消息,所以我通过尝试使用不同的浏览器发出更多请求来测试这个理论(见编辑)。我的理论被推翻了,六个似乎也很小。
-
浏览器对发送到同一域的并发请求的数量有限制。
-
@Phil Cheers,这正是我所需要的