我有一个节点(v14.19.1)进程,它收集数据,然后通过向VictoriaMetrics发出http请求将其插入/api/v1/import
。我使用axios发送请求。在绝大多数情况下,这是完美的。偶尔,客户端使用“套接字挂起”(带有以下堆栈)出错,数据永远无法到达数据库:
Error: socket hang up
at connResetException (internal/errors.js:639:14)
at Socket.socketOnEnd (_http_client.js:499:23)
at Socket.emit (events.js:412:35)
at Socket.emit (domain.js:475:12)
at endReadableNT (internal/streams/readable.js:1334:12)
at processTicksAndRejections (internal/process/task_queues.js:82:21)
有时,我看到了似乎与EPIPE一样明显的问题。当数据库和数据收集进程位于同一虚拟机上时,情况总是如此,但有时在不同的机器上也会发生这种情况:
Error: write EPIPE
at afterWriteDispatched (internal/stream_base_commons.js:156:25)
at writeGeneric (internal/stream_base_commons.js:147:3)
at Socket._writeGeneric (net.js:798:11)
at Socket._write (net.js:810:8)
at writeOrBuffer (internal/streams/writable.js:358:12)
at Socket.Writable.write (internal/streams/writable.js:303:10)
at ClientRequest._writeRaw (_http_outgoing.js:351:17)
at ClientRequest._send (_http_outgoing.js:327:15)
at ClientRequest.end (_http_outgoing.js:849:10)
日志记录显示,套接字挂起往往发生在请求启动后的5-6s左右,有时长达15s左右;这似乎不足以触发我所知道的任何连接超时。当发出更多/或更大的数据写入请求时,错误似乎更普遍,但有时也会在小写入时发生。
我越来越怀疑问题在于客户端(或它正在运行的虚拟机),而不是数据库。我的证据是:
特别是,第二点让我怀疑,我偶尔会碰到某些节点或OS (Ubuntu20.04),限制连接/文件/网络流量/等等,从而导致某些连接在较高流量期间被客户端(或其操作系统)过早关闭。我能做些什么来证实或反驳这种怀疑?或者还有什么其他的根本原因可以解释我所观察到的?
所有涉及的虚拟机都运行在Azure云中的专用网络(否则是可靠的)上。
发布于 2022-08-30 13:54:00
我似乎通过对我的客户端代码进行两次更改来解决这个问题:
httpAgent: new http.Agent({maxSockets: 10}),
httpsAgent: new https.Agent({maxSockets: 10})
retryCondition: axiosRetry.isNetworkError
;我必须显式地设置它,因为在默认情况下,只会保守地重试那些保证是幂等的请求,但是在这种情况下,我需要重试POST(我知道在这种情况下这样做是安全的)。我不确定这些更改中的哪一个解决了问题,或者它们是否都起了作用,因为我同时实现了它们。但是,自从部署这些更改后,我还没有看到任何EPIPE或“套接字挂起”错误。
https://stackoverflow.com/questions/73073447
复制相似问题