我们有一个带有Express服务器的NextJS应用。
我们看到的问题是我们正在调用的API出现大量网络超时(底层异常显示为“套接字挂断”)。但是,该API不会显示任何错误或响应速度慢。好像API调用甚至没有完全到达API。
我们尝试过的理论和事情:
阻塞的事件循环:我们尝试用异步“ winston”框架替换同步日志记录,以确保我们不阻塞事件循环。不知道还有什么可能阻止
高CPU:有时CPU峰值可能达到60%。我们正在尝试通过取出一些正在使用的正则表达式来尽量减少这种峰值(因为我们听说过这些正则表达式很昂贵,在CPU方面)。
有关API的JSON响应有多大?我们正在传递大量数据……
我们的Express路由结构中有太多复杂的路由:我们通过将一些路由组合在一起来减少路由的数量(这会导致路由定义中的更复杂的正则表达式)…
有什么想法为什么我们会看到这些获取超时?它们仅在负载测试期间和生产环境中出现,但它们可能会使高负载的整个应用程序瘫痪。
答案 0 :(得分:0)
发出错误的code:
function socketCloseListener() {
const socket = this;
const req = socket._httpMessage;
debug('HTTP socket close');
// Pull through final chunk, if anything is buffered.
// the ondata function will handle it properly, and this
// is a no-op if no final chunk remains.
socket.read();
// NOTE: It's important to get parser here, because it could be freed by
// the `socketOnData`.
const parser = socket.parser;
const res = req.res;
if (res) {
// Socket closed before we emitted 'end' below.
if (!res.complete) {
res.aborted = true;
res.emit('aborted');
}
req.emit('close');
if (res.readable) {
res.on('end', function() {
this.emit('close');
});
res.push(null);
} else {
res.emit('close');
}
} else {
if (!req.socket._hadError) {
// This socket error fired before we started to
// receive a response. The error needs to
// fire on the request.
req.socket._hadError = true;
req.emit('error', connResetException('socket hang up'));
}
req.emit('close');
服务器不发送并响应时,将生成消息。 就是这么简单。
但是为什么API服务器不会发送响应? 好吧,在没有看到可复制的最低代码的情况下,我只能为您提供一些指针。
此issue here详细讨论了版本6和版本8之间的变化,特别是现在带有主体的GET如何导致它。这种行为上的变化更加符合REST规范。