我不知道,如果这与koa有关,或者是某些其他npm模块或其他问题。我将从这里开始。
所以问题。我正在使用koa v1编写的REST api。我们在Docker镜像中运行节点服务器。我们拥有的一个端点,启动导入并返回状态200,并显示以下消息:" import started",导入完成后,我们发送Slack消息通知我们。
所以首先我在本地机器上测试了服务器,一切正常(端点不会抛出任何错误)。然后我建造了码头图像。我运行容器localy,一切正常(端点不会抛出任何错误)。我将我的图像部署到Mesos环境,到目前为止一切正常。容器运行,每个端点都在导入端点旁边工作。当我调用它时,几秒钟后(5到10),我得到ECONNRESET
错误,正在运行的容器被杀死并且启动了新的运行实例。因此导入终止。
一开始我们将128 MB ram分配给docker容器,这似乎已经足够了。导入错误后,我们认为可能是OOM被杀死的进程。所以我们决定检查dmesg,我们找不到任何与OOM和正在运行的容器进程相关的日志条目。然后我们在本地检查了容器的ram使用情况(使用htop)并发现它使用了aprox。 250+ MB,所以我们决定在marathon配置中添加更多ram(512 MB)。然而,这没有帮助,发生了同样的错误。
由于错误不够明确,我们安装了longjohn
模块,因此我们可以获得更详细的错误消息。这让我们获得了更多信息,但没有我们想象的那么多。
Error: read ECONNRESET
at exports._errnoException (util.js:1026:11)
at TCP.onread (net.js:569:26)
---------------------------------------------
at Application.app.callback (/src/node_modules/koa/lib/application.js:130:45)
at Application.app.listen (/src/node_modules/koa/lib/application.js:73:39)
at Promise.then.result (/src/server.js:97:13)
Error: read ECONNRESET
at exports._errnoException (util.js:1026:11)
at TCP.onread (net.js:569:26)
server.js的第97行是:
96:if(!module.parent) {
97: app.listen(port, (err) => {
98: if (err) {
99: console.error('Server error', err);
100: }
101: console.log('Listening on the port', port);
102: });
103:}
那么端点逻辑究竟发生了什么。我们正在使用postgres npm模块pg
。我们将pg.Pool
传递给上下文,以后我们可以在模型中使用它。我们正在执行封装在promise中的插入查询并在数组中推送promises。大约有2700多条记录。稍后我们对promises数组Promise.all
进行then
我们将消息发送给Slack。
正如您所看到的,我不知道该错误是与koa
还是pg
或其他相关内容有关。更有趣的是,本地一切都可以工作(节点服务器以及docker容器),但是在Mesos上它没有。我怎样才能找出问题所在?
答案 0 :(得分:0)
根据this github issue,这是由tiny-lr引起的错误。
似乎降级到版本0.2.1
会阻止它,但这通常是您使用的其他软件包的依赖项,而您无法控制。您可以通过显示除此之外的所有错误来过滤掉错误:
if (error.code !== 'ECONNRESET') { console.log(error) }
问题仍然存在,可以追溯到2016年10月27日。不知道它是否会得到修复。但就反馈而言,它似乎不是一个危险的错误,或者无论如何都会产生任何影响。但是,如果有办法的话,我也宁愿修理我的。
答案 1 :(得分:0)
感谢另一位开发人员,我们发现了ERROR的原因。当导入运行时,我们使用了池中的所有连接。
当马拉松在导入时请求服务状态时,服务尝试连接到数据库以测试连接,此时终止与数据库的连接。服务变得不健康,马拉松重新开始服务。我们重新考虑了导入代码。我们限制了池连接的数量。