Elixir 在Phoenix中配置请求超时?

Elixir 在Phoenix中配置请求超时?,elixir,phoenix-framework,Elixir,Phoenix Framework,我希望请求在一段时间后超时,比如说20秒。如果应用程序发送响应的时间超过20秒,Phoenix应该取消执行并立即回复一些错误,最好是HTTP 503 我浏览了Phoenix文档,但没有发现任何关于请求超时选项的提及。看起来Cowboy有一个:timeout选项,我尝试将其设置为10毫秒,但它仍然允许请求花费8951毫秒: config :app, SomeApp.Endpoint, http: [port: 4000, timeout: 10] 牛仔文档将此选项定义为: Cowboy关闭连

我希望请求在一段时间后超时,比如说20秒。如果应用程序发送响应的时间超过20秒,Phoenix应该取消执行并立即回复一些错误,最好是HTTP 503

我浏览了Phoenix文档,但没有发现任何关于请求超时选项的提及。看起来Cowboy有一个:timeout选项,我尝试将其设置为10毫秒,但它仍然允许请求花费8951毫秒:

config :app, SomeApp.Endpoint,
  http: [port: 4000, timeout: 10]
牛仔文档将此选项定义为:

Cowboy关闭连接前无请求的时间(毫秒)

这不是我要找的


可以在Phoenix中设置请求超时吗?

这绝不是web服务器/框架的责任。牛仔没有线索,也不应该有!关于应用程序中发生的事情,它服务于连接。菲尼克斯可以处理这件事,但这会违反法律。毕竟,前面提到的超时更多的是关于业务逻辑。想象一下牛仔/凤凰会试图处理超时:当前正在执行的处理程序会发生什么

这就是说,应用程序应该处理这种超时,而且它相对简单:只需要在任务中使用您想要的超时来包装底层执行。这样它将是灵活、可靠的,并且您可以指定哪些控制器/操作应以这种方式运行,哪些不应以这种方式运行

在伪代码中,它是真实代码,但我没有测试它:

def createconn、params do或任何其他操作 fn->准备结果结束 |>Task.async |>任务10⇐ 在这里 |>案例 {:好的,结果}->成功 康涅狄格州 |>放置200 |>json%{ok:result} 无->尚未完成;对任务本身进行smth! 康涅狄格州 |>放置状态503 |>json%{error::timeout} {:退出,原因}->不应发生[参见Task.yield/2文档] 康涅狄格州 |>put_status500内部服务器错误;想不到的 |>json%{错误:原因} 终止 终止

旁注:当然,如果在整个应用程序中都需要这种行为,只需声明一个宏就可以了

config :app, SomeApp.Endpoint,
  http: [port: 4000, timeout: 10]
不起作用。。试着换成

config :app, SomeApp.Endpoint,
  http: [port: 4000, protocol_options: [idle_timeout: 10_000]]


旁注:SRP=单一责任原则@谢谢,我想这个缩写词已经广为人知了;我把链接直接放到了答案中。值得注意的是,空闲超时仅在Cowboy 2.0中可用+