在Phoenix中配置请求超时?
问题描述:
我想要一段时间后请求超时,比如20秒。如果应用程序发送响应的时间超过20秒,Phoenix应该取消执行并立即回复一些错误(最好是HTTP 503)。在Phoenix中配置请求超时?
我搜索了凤凰文档,但找不到任何请求超时选项。它看起来像牛郎有:timeout
选项,我尝试设置为10毫秒,但它仍然允许的请求采取8951毫秒:
config :app, SomeApp.Endpoint,
http: [port: 4000, timeout: 10]
原来牛郎文档定义了这个选项为:
牛仔关闭连接之前没有请求的时间(毫秒)。
这不是我要找的。
是否可以在Phoenix中设置请求超时?
答
这绝不是Web服务器/框架的责任。牛仔不知道应用程序中发生了什么,它服务于连接。菲尼克斯可以照顾,但它会违反SRP。毕竟,上述超时更多的是关于业务逻辑。想象一下,牛仔/凤凰会试图处理超时:目前正在执行处理程序会发生什么?
也就是说,应用程序应该处理这种超时,并且它相对容易:只需要将任务中的底层执行包含在所需的超时中。这样,它将是灵活的,可靠的,你可以指定哪些控制器/动作应该以这种方式行事,哪些不应该。
在伪代码(这是一个真正的代码,但我没有测试):
def create(conn, params) do # or any other action
fn -> prepare_result end
|> Task.async()
|> Task.yield(10) # ⇐ HERE!!!
|> case do
{:ok, result} -> # success
conn
|> put_status(200)
|> json(%{ok: result})
nil -> # not finished yet; do smth with the task itself!
conn
|> put_status(503)
|> json(%{error: :timeout})
{:exit, reason} -> # should not happen [see Task.yield/2 docs]
conn
|> put_status(500) # internal server error; unexpected
|> json(%{error: reason})
end
end
旁注:当然,如果你在整个应用程序需要这种行为,只是声明宏这样做,还是喜欢。
旁注:SRP =单一责任原则。 https://en.wikipedia.org/wiki/Single_responsibility_principle – raarts
@raarts谢谢,我认为这个缩写是广为人知的;我把链接直接放入答案中。 – mudasobwa