SenecaJS服务和Express API之间的客户端请求超时

时间:2018-08-07 22:16:11

标签: node.js express timeout client seneca

我正在使用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

希望有人可以帮助我解决这个问题,并且已经解决了很长时间。

编辑 因此,我一直在研究超时配置。通过在最高级别(Log of script execution when attempting to send request directly to the service)的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)。我不明白为什么它说“服务不可用”,因为该操作确实已执行并且甚至成功完成。

我似乎无法理解不同的行为。

1 个答案:

答案 0 :(得分:1)

我还处理了Seneca的超时问题。 对于我的应用程序,解决方案是:

  1. 在require('seneca')中设置超时时间:

    let seneca = require('seneca')(
      {
        timeout: config.request_timeout,
        tag: ...
      }
    )
    
  2. 设置每个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 }
    }
  }
);