2017-10-19 85 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