目前,我正在使用节点hapijs 框架开发REST API。 API部署在Heroku上。
API中有一个GET端点,它发出get请求以从第三方检索数据并在发送回复之前处理数据。此特定端点不时超时。当端点超时时, Heroku返回H12错误。一旦超时,对该端点的后续请求将导致H12错误。我必须重新启动Heroku上的应用程序才能使该端点再次运行。 API中的其他任何端点都不会受到此错误的影响,并且即使在出现错误之后也能继续正常工作。
在我的调试过程中查看日志时,似乎有时候第三方API没有返回响应,导致错误。
我尝试了以下解决方案来尝试解决问题:
我正在使用请求库发出请求。因此,我尝试将超时设置为5000毫秒,作为传递给请求的选项的一部分。它有时工作...触发超时并且端点发送与请求关联的超时错误。这是我想要的行为,因为后续的端点请求工作。但是,有时候不会触发请求超时,但Heroku仍然会返回H12错误(总是在30秒后,默认为Heroku)。之后,对该端点的后续请求将返回H12错误(也在30秒后)。似乎某些进程在Heroku上“卡住”,并且在我重新启动应用程序之前不会终止。
我尝试在hapi.js路由配置对象中添加超时。我得到与上面相同的结果。
我一直在做研究,并怀疑这些问题与here和here给出的描述有关。似乎在应用程序服务器级别设置一个可以向Heroku工作人员发送SIGKILL的超时可能会起作用。在Ruby中看起来相当简单但我找不到有关如何在Node中执行此操作的更多信息。
非常感谢任何见解。我知道向第三方发出请求时可能会发生超时。这不是问题。问题是端点似乎在超时后“停留”在Heroku上并且没有响应。
感谢您的帮助!
答案 0 :(得分:6)
我有一个类似的问题,在放弃一天后,我回到它并发现了我的错误。当服务器端发生错误时,我没有向客户端发送响应。无论服务器端算法的结果如何,都要确保返回响应。如果有错误,请返回。如果请求成功,则返回该响应。我希望有所帮助。
如果这没有帮助,请查看heroku关于处理Request Timeouts的指南,尤其是调试请求超时部分可能有所帮助: