2017-10-19 155 views
0

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

我搜索了凤凰文档,但找不到任何请求超时选项。它看起来像牛郎有:timeout选项,我尝试设置为10毫秒,但它仍然允许的请求采取8951毫秒:

config :app, SomeApp.Endpoint, 
    http: [port: 4000, timeout: 10] 

原来牛郎文档定义了这个选项为:

牛仔关闭连接之前没有请求的时间(毫秒)。

这不是我要找的。

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

回答

1

这绝不是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 

Task.yield/2


旁注:当然,如果你在整个应用程序需要这种行为,只是声明宏这样做,还是喜欢。

+0

旁注:SRP =单一责任原则。 https://en.wikipedia.org/wiki/Single_responsibility_principle – raarts

+0

@raarts谢谢,我认为这个缩写是广为人知的;我把链接直接放入答案中。 – mudasobwa