2011-09-22 26 views
3

我們有一個基於apache mina的GPRS網關(服務器)。有時,通常當連接從客戶端慘遭終止時,即拔掉電源線或任何其他異常關機或網絡問題時,它不會在服務器端被移除或關閉。它仍然在那裏,處於閒置狀態,因爲我不知道多久(可能永遠)。 有時我們會在關閉服務器時遇到問題,MINA需要花費太多時間,有時我們最終必須殺死它。我們懷疑這個問題與無法連接的問題有關。其實,這種死不了的關係是有道理的。由於連接被殘忍地關閉,並且mina沒有辦法檢查它(這就是tcp會話的工作原理)。 我們作爲一種解決方法,設計了一個解決方案,如果它保持閒置(讀取和寫入)30分鐘(或任何可配置的時間),我們將關閉會話。我們不喜歡的原因有兩個:
1-看起來不太好。
2-加我們有一個規則,客戶端與服務器建立持久連接。因此,設置'空閒超時'有點困難,因爲我們不能關閉任何空閒時間爲x min/hrs的會話,因爲它可以是有效的連接。

那麼,有沒有更好,更安全的(在我們的情況下)檢測和清理MINA中的這些死亡連接?apache中的死會話

回答

1

在這兩種情況下長時間沒有活動的連接和丟失的連接 - 在通道中沒有任何活動應該導致在OSI model的每個層的配置時間之後超時。 例如你的防火牆/路由器/服務器可能會在10分鐘內超時不活動的連接條目,那麼你的應用層連接也應該在10分鐘後完成 - 等待更多沒有意義。

防止無聲連接超時保持有效協議應引入。 它可能是ping(不完全是ICMP)或其他形式的定期無操作通信。 當對等體處於活動狀態時,它應該響應並刷新所有網絡層的超時倒數。在超時或層信令斷開連接導致嘗試失敗後,您可以假定您的應用層連接也已中斷。

+0

感謝您提供有用的見解。我正在尋找的是使用我使用的框架(Apache Mina)處理它的好方法。 –