我们有一个NodeJS应用程序作为一个运行在一个基于Linux的应用服务计划上。(配置为正常运行)。
设置:
套餐:
web服务进行基本数据计算,将结果作为REST服务返回。Redis用于存储先前计算的结果。
在门户中的Application级别上启用了应用程序洞察。对于额外的故障监视,我们在代码中添加了NPM包应用洞见版本2.2.0。
应用程序洞察力在应用程序启动时配置如下:
const appInsights = require("applicationinsights");
appInsights.setup(process.env.APPLICATIONINSIGHTS_CONNECTION_STRING)
appInsights.start()
应用程序服务运行了一段时间,但随后意外崩溃,在KUDU日志中有以下内容:
2022-01-20T00:41:19.028838008Z events.js:377
2022-01-20T00:41:19.029056811Z throw er; // Unhandled 'error' event
2022-01-20T00:41:19.029073211Z ^
2022-01-20T00:41:19.029079111Z
2022-01-20T00:41:19.029084211Z SocketClosedUnexpectedlyError: Socket closed unexpectedly
2022-01-20T00:41:19.029089512Z at TLSSocket.<anonymous> (/home/site/wwwroot/node_modules/@node-redis/client/dist/lib/client/socket.js:184:118)
2022-01-20T00:41:19.029095412Z at Object.onceWrapper (events.js:520:26)
2022-01-20T00:41:19.029100512Z at TLSSocket.emit (events.js:412:35)
2022-01-20T00:41:19.029105412Z at net.js:675:12
2022-01-20T00:41:19.029110212Z at TCP.done (_tls_wrap.js:563:7)
2022-01-20T00:41:19.029115112Z Emitted 'error' event on Commander instance at:
2022-01-20T00:41:19.029128012Z at RedisSocket.<anonymous> (/home/site/wwwroot/node_modules/@node-redis/client/dist/lib/client/index.js:338:14)
2022-01-20T00:41:19.029149012Z at RedisSocket.emit (events.js:400:28)
2022-01-20T00:41:19.029154512Z at RedisSocket._RedisSocket_onSocketError (/home/site/wwwroot/node_modules/@node-redis/client/dist/lib/client/socket.js:207:10)
2022-01-20T00:41:19.029159212Z at TLSSocket.<anonymous> (/home/site/wwwroot/node_modules/@node-redis/client/dist/lib/client/socket.js:184:107)
2022-01-20T00:41:19.029164013Z at Object.onceWrapper (events.js:520:26)
2022-01-20T00:41:19.029168413Z [... lines matching original stack trace ...]
2022-01-20T00:41:19.029172813Z at TCP.done (_tls_wrap.js:563:7)
然后,我删除了使用Redis来测试没有外部连接的场景,但是在运行了一段时间之后,应用程序仍然会崩溃,而不会触发try/catch代码。
我能够跟踪以下调试信息:
arg0:OperationalError {cause: Error: read ECONNRESET
at TCP.onStreamRead…nternal/stream_base_commons:220:20)
at TC…, isOperational: true, errno: -4077, code: 'ECONNRESET', syscall: 'read', …}
cause:Error: read ECONNRESET\n at TCP.onStreamRead (node:internal/stream_base_commons:220:20)\n at TCP.callbackTrampoline (node:internal/async_hooks:130:17) {errno: -4077, code: 'ECONNRESET', syscall: 'read', stack: 'Error: read ECONNRESET\n at TCP.onStreamRea…Trampoline (node:internal/async_hooks:130:17)', message: 'read ECONNRESET'}
code:'ECONNRESET'
errno:-4077
isOperational:true
syscall:'read'
message:'read ECONNRESET'
name:'Error'
stack:'Error: read ECONNRESET\n at TCP.onStreamRead (node:internal/stream_base_commons:220:20)\n at TCP.callbackTrampoline (node:internal/async_hooks:130:17)'
本地调试控制台将我指向文件:/node_modules\diagnostic-channel-publishers\dist\src\console.pub.js:43:39,据我所知,该文件用于将控制台日志事件记录到Application *。
然后我删除了Application,Web应用程序在没有崩溃的情况下运行稳定。我重新启用了Redis的使用,到目前为止没有发现任何问题。这向我指出了一个问题,即应用程序洞察无法很好地处理TCP套接字连接到应用程序洞察服务的中断。
有什么方法可以证实这一点或者防止应用程序崩溃吗?
发布于 2022-01-21 12:37:16
错误:在TCP.onStreamRead上阅读ECONNRESET\n (节点:内部/流基_公域:220:20)\n在TCP.callbackTrampoline (节点:内部/异步_钩子:130:17) {errno:-4077,代码:'ECONNRESET',syscall:' read ',堆栈:‘TCP.onStreamRea…Trampoline上的读ECONNRESET\n’(节点:内部/异步_钩子:130:17),消息:'read ECONNRESET'}
"ECONNRESET“通常是在TCP连接的另一端由于任何与协议相关的问题而关闭其结束时抛出的,而且由于没有人正在监听'error‘事件,因此会引发’error‘事件。为了解决这个问题,您需要设置一个侦听器来处理这样一个错误的情况。
应用程序洞察无法优雅地处理TCP套接字连接中的中断
可以进行的出站连接的数量是有限的。出站连接的最大数量取决于所使用的工作人员的大小。
有关更多信息,请参阅此MSFT文档
https://stackoverflow.com/questions/70787026
复制相似问题