2012-02-23 103 views
2

所以我們試圖實現的是保持從移動設備到我們的Erlang HTTP服務器的大量併發連接。移動設備當然可能有非常間歇性的連接,所以我們希望儘快放棄無用的連接,以避免它們的開銷。丟失連接後儘快丟棄流HTTP連接

現在,我不確定應該在什麼級別檢測死連接。 TCP有keepalive數據包,它需要一個ACK。所以理想情況下,我們會在15秒內發送一個Keepalive數據包,如果我們在接下來的15秒內沒有收到ACK,那麼我們會斷開連接。但是,我不知道這在Erlang中甚至是可能的。另外,我認爲有些NAT,Wi-Fi路由器和移動網絡可能會在一段時間內確認Keepalive,如果我錯了,請糾正我的錯誤。是這樣的,如果是的話,是否有任何TCP級別的替代方式來做'心跳'?

我們還嘗試了應用程序級心跳 - 在HTTP流下發送\ n。但是,即使設置了所有適用的Erlang選項(包括send_timeout),在某些情況下(例如,移動設備偏離其Wi-Fi路由器太遠),我們在約5分鐘內也沒有發生任何錯誤。

如何最好地實現流式HTTP連接,服務器在失去聯繫後儘快掉線?任何幫助將不勝感激!

+0

若不是HTTP我只是建議發送來自客戶端的東西。您是使用現成的HTTP服務器還是編寫自定義的服務器? – 2012-02-23 18:28:59

+0

你不能在機器級配置套接字保持活動超時嗎? – Isac 2012-02-23 18:47:45

+0

@asaddude我們編寫了自己的HTTP服務器。如果可能的話,我們希望堅持使用HTTP,並且在請求之後不做任何雙向的東西。 – Max 2012-02-23 19:26:25

回答

2

您可以爲HTTP連接添加特定的看門狗。看門狗將具有可配置的超時時間,在連接的每個操作(讀取或寫入)之後都會被重置。如果在指定的超時時間內沒有對套接字進行操作 - 連接關閉。

該方法將消除過時連接(連接完美健康但沒有任何I/O活動)的問題。如果客戶端不在覆蓋範圍內 - 連接將只持續到指定的超時。使用看門狗方法時也不需要保持活動機制。

唯一的缺點是服務器不會立即檢測到連接斷開,而是會等待連接看門狗中指定的超時。