我正在使用SenecaJS构建基于微服务的应用程序。到目前为止,我已经概念化了一种微服务,该微服务仅包含一项操作。该操作在被调用时将执行一个耗时的shell命令(大约耗时3分钟)并作为响应返回-shell命令的输出。我的代码文件在此处可用:https://gist.github.com/ohmtrivedi/5a94841d25714f3cfd6aee260add97bb
因此,我一直试图以两种不同的方式对此服务进行请求:首先,我使用cURL向服务(运行插件osfp_tool
)发送直接请求,如下所示:{ {3}}。
其次,通过参考本教程http://senecajs.org/getting-started/#writing-microservices,我编写了与服务(osfp_service
)通信的Express API。因此,我将HTTP请求(使用POSTMAN)发送到Express API。
在这两种情况下,我通常都会收到“客户端请求超时”错误。经过研究,我了解了Seneca实例中的超时配置。因此,我在Seneca服务(osfp_service
)和Express API(app.js
)中的2个地方添加了时间配置。请注意,我已将超时设置为300000ms或5分钟。我已经检查了shell命令大约需要3分钟,所以设置的超时时间比这更多。但是,我仍然会遇到“客户端请求超时”错误,如下所示。我知道shell命令执行没有错误,就像在我的服务日志中一样,即使我收到客户端超时请求错误,该操作也成功完成了执行,可以使用console.log消息看到。
http://senecajs.org/getting-started/#web-server-integration
希望有人可以帮助我解决这个问题,并且已经解决了很长时间。
编辑
因此,我一直在研究超时配置。通过在最高级别()的seneca实例中设置超时,我能够解决osfp_service.js
脚本中的超时错误。
如果我以相同的方式在app.js
中设置超时配置(https://gist.github.com/ohmtrivedi/5a94841d25714f3cfd6aee260add97bb#file-osfp_service-js-L8),那么我仍然会收到错误504:客户端请求超时/网关超时(https://gist.github.com/ohmtrivedi/5a94841d25714f3cfd6aee260add97bb#file-app2-js-L26)。
如果我在seneca实例(https://drive.google.com/open?id=1El2JCy047dnm6PHlvU33d_mKPuIWUlfX)中的传输对象内的app.js
中设置了超时配置,那么我将收到错误503:响应超时/服务不可用(https://gist.github.com/ohmtrivedi/5a94841d25714f3cfd6aee260add97bb#file-app1-js-L26)。我不明白为什么它说“服务不可用”,因为该操作确实已执行并且甚至成功完成。
我似乎无法理解不同的行为。
答案 0 :(得分:1)
我还处理了Seneca的超时问题。 对于我的应用程序,解决方案是:
在require('seneca')中设置超时时间:
let seneca = require('seneca')(
{
timeout: config.request_timeout,
tag: ...
}
)
设置每个act()调用的超时时间:
seneca.act({timeout$: config.request_timeout, role: ...});
希望这会有所帮助。
编辑:
如this post中所示,还可以配置传输超时:
let seneca = require('seneca')(
{
timeout: config.request_timeout,
tag: ...,
transport: {
'web': { timeout: config.request_timeout },
'tcp': { timeout: config.request_timeout }
}
}
);