簡體   English   中英

當客戶端使用readTimeout關閉連接時,服務器上會發生什么

[英]what happens at the server when client closes the connection by using readTimeout

當客戶端通過使用readTimeout關閉與API的連接時,服務器上會發生什么。請求的執行將完成,否則一旦發生超時就會中斷或執行將完成,響應流被響應服務器阻塞應該發送給用戶

超時是一種不整齊的方式來關閉連接 - 當你的一方連接超時時,很有可能你無法告訴對方你已經超時並正在關閉連接。 也就是說,雙方的協調行動沒有正式結束這種聯系,只是一方決定將其視為死亡。

解決這個問題的方法是在連接的兩端都有超時 - 如果一方超時,另一方也會超時,最終。


至於服務器端究竟發生了什么:由於服務器不知道連接在其自身超時到期之前已經死亡,因此它會認為連接正常,並且通常會處理請求並嘗試寫入響應。 可能會有一些緩沖響應,因此嘗試編寫響應甚至可能對服務器起作用。

當服務器嘗試向響應寫入足夠的數據以填充可能的緩沖區時,它將阻塞,然后當超時發生時,將拋出異常,最后讓服務器知道連接超時。

如果服務器沒有用其響應填充緩沖區,則在嘗試關閉連接時應該發生相同的(阻塞,然后異常)(但這可能已經發生在應用程序之外,在應用服務器容器代碼中)。

如果你有可能在超時已經發生后最終嘗試寫響應,你應該立即得到一個例外。

那么在服務器上究竟發生了什么在很大程度上取決於您自己

  • 如果您只在執行所有相關操作后寫入響應,則將執行這些操作
  • 如果您混合業務邏輯和編寫響應,可能會或可能不會執行某些邏輯(取決於您已經寫入響應的數據量以及在什么時間),並且沒有好的方法來估計會發生什么

無論哪種方式,服務器最終都會知道發生的超時,但我不確定您的應用程序是否始終會獲取此信息。

當客戶端使用readTimeout關閉與API的連接時,服務器上會發生什么。

與客戶因任何其他原因關閉時發生的情況相同。 服務器將繼續執行請求,將成功寫入響應的第一部分,並在寫入其余部分時可能會出現“連接重置”錯誤,如果有休息,並且取決於時間和響應的時間等。

是否將執行請求的執行

是。

或者一旦超時發生就會中斷

沒有。

或者執行將完成

是。

並且響應流被服務器應該發送給用戶的響應阻塞

是的,但這最終會導致服務器上的“連接重置”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM