0

我正在使用 SenecaJS 构建基于微服务的应用程序。到目前为止,我已经概念化了一个微服务,它只包含一个动作。调用此操作时,将执行一个耗时的 shell 命令(大约耗时 3 分钟)并作为响应返回 - shell 命令的输出。我的代码文件可以在这里找到:https ://gist.github.com/ohmtrivedi/5a94841d25714f3cfd6aee260add97bb

因此,我一直在尝试以两种不同的方式向该服务发出请求:首先,我osfp_tool使用 cURL 向服务(运行插件)发送直接请求,如下所示:http: //senecajs.org/getting -started/#writing-microservices。其次,通过参考本教程:http ://senecajs.org/getting-started/#web-server-integration ,我编写了一个与我的服务(osfp_service)通信的 Express API。因此,我将 HTTP 请求(使用 POSTMAN)发送到 Express API。

我曾经在这两种情况下都收到客户端请求超时错误。经过一番研究,我了解了 Seneca 实例中的超时配置。因此,我在 2 个地方添加了时间配置 - 在 Seneca 服务 ( osfp_service) 以及 Express API ( app.js) 中。请注意,我已将超时设置为 300000 毫秒或 5 分钟。我已经检查过 shell 命令大约需要 3 分钟,所以超时设置得更多。但是,我仍然面临客户端请求超时错误,如下所示。我知道 shell 命令执行没有错误,就像在我的服务日志上一样,即使在我收到客户端超时请求错误之后,操作也成功完成了执行,这可以使用 console.log 消息看到。

尝试直接向服务发送请求时的脚本执行日志

希望有人可以帮助我解决这个问题,现在坚持了很长时间。

编辑 所以,我一直在玩超时配置。我能够osfp_service.js通过将 seneca 实例中的超时设置在最顶层(https://gist.github.com/ohmtrivedi/5a94841d25714f3cfd6aee260add97bb#file-osfp_service-js-L8)来解决脚本中的超时错误。

app.js如果我以相同的方式设置超时配置( https://gist.github.com/ohmtrivedi/5a94841d25714f3cfd6aee260add97bb#file-app2-js-L26),那么我仍然会收到错误 504:客户端请求超时/网关超时(https: //drive.google.com/open?id=1El2JCy047dnm6PHlvU33d_mKPuIWUlfX)。

app.js如果我在 seneca 实例的传输对象内部设置超时配置( https://gist.github.com/ohmtrivedi/5a94841d25714f3cfd6aee260add97bb#file-app1-js-L26),那么我得到错误 503:响应超时/服务不可用(https ://drive.google.com/open?id=1u6w7XyK9-vAJVhna_JnIQ4imRzOm_51T)。我不明白为什么它说服务不可用,因为该操作确实被执行,甚至成功完成。

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

4

1 回答 1

1

我还研究过 Seneca 的超时问题。对于我的应用程序,解决方案是:

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

    let seneca = require('seneca')(
      {
        timeout: config.request_timeout,
        tag: ...
      }
    )
    
  2. 在每个 act() 调用中设置超时:

    seneca.act({timeout$: config.request_timeout, role: ...});
    

希望这可以帮助。

编辑

本文所述,还可以配置传输超时:

let seneca = require('seneca')(
  {
    timeout: config.request_timeout,
    tag: ...,
    transport: {
      'web': { timeout: config.request_timeout },
      'tcp': { timeout: config.request_timeout }
    }
  }
);
于 2018-08-16T09:28:08.787 回答