【问题标题】:Client Request Timeout between SenecaJS Service and Express APISenecaJS 服务和 Express API 之间的客户端请求超时
【发布时间】:2018-09-26 00:42:06
【问题描述】:

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

所以,我一直在尝试以两种不同的方式向该服务发出请求:首先,我使用 cURL 向服务(运行插件 osfp_tool)发送直接请求,如下所示: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 消息看到。

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

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

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

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

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

【问题讨论】:

    标签: node.js express timeout client seneca


    【解决方案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 }
        }
      }
    );
    

    【讨论】:

    • 所以@jack-y,我尝试向我的 osfp_service.js 发出请求(不是通过 Express API),如下所示:curl -d '{"timeout$": 300000, "role":"osfp_tool", "cmd":"fp_os", "remote_ip":"222.136.147.76"}' http://localhost:80/act。但是,我仍然收到{ "code": "ETIMEDOUT" } 作为回复。动作仍然会在其一侧完成。
    • 嗨@jack-y,在所有地方设置传输超时(传输超时、seneca 超时,甚至在 seneca.act 调用中)确实有效,但并非总是如此。因此,我将超时设置为 5 分钟(300000),因为如前所述,该操作最多需要 3 分钟。但有时,app.js 脚本会失败并显示 statusCode: 502, error: Bad Gateway, message: Client request error: socket hang up。我已经用当前版本的代码更新了我的要点。希望您对此有所了解。
    猜你喜欢
    • 2015-08-02
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2016-05-12
    • 2014-10-13
    相关资源
    最近更新 更多