Networking

java sockets實現客戶端伺服器系統有什麼更好的解決方案

  • October 24, 2014

我需要一些有網路經驗的人的建議。

我已經創建了一個系統,旨在監視一些由自動調度程序或操作員啟動的用 java 編寫的任務(5-30)。這些任務涉及銀行或保險背景下的系統。

該系統由一個客戶端類組成,來自一個多執行緒伺服器和來自Web 應用程序。任務將使用客戶端與伺服器通信,Web 應用程序也會這樣做以監控在伺服器上註冊的任務的性能,並且 Web 應用程序也可能向任務發送一些命令,例如“停止”或“暫停”。

任務

$$ 1-n $$<—> 伺服器 <—> webapp 由於 Web 應用程序必須能夠向批處理髮送命令,所以問題就在這裡。我找到了2個解決方案:

1)無連接;雙方之間不保持打開連接,客戶端定期向伺服器發送狀態並詢問伺服器是否有命令給他,週期應該是幾秒鐘,每個請求打開然後關閉一個套接字連接,類似http協議的方式。

2)全連接;各方之間保持活躍的連接。此時,任務可以與伺服器進行通信,伺服器與任務之間無需輪詢。例如,每次 Web 應用程序向伺服器請求任務的狀態時,他都會詢問客戶端誰將提供它。

我暫時採用了解決方案 1,在模擬測試環境中,它執行良好。

問題是,在資源的使用和靈活性方面,兩者之間肯定存在更好的解決方案,如果是,是哪一個?

如果您有一些與該主題的具體討論相關的連結,這是歡迎的。

謝謝再見。

這個問題可能與 Server Fault 無關。這當然是基於意見的。

適合您的軟體的架構取決於使用應用程序的環境的網路和安全架構。它還取決於組件之間所需的通信頻率以及輪詢與持久連接可能使用多少頻寬。

如果這是為轉售而建構的產品,我會盡可能地靈活,並且可能會嘗試利用多種架構。

例如,如果客戶端和伺服器組件在同一個安全“區域”中執行,您可能會考慮一個架構,其中一個組件可以發起與另一個組件的通信(實際上在某種程度上使兩個組件都成為“伺服器”)。這將最大限度地減少延遲並消除輪詢。

或者,如果客戶端以這樣一種方式被隔離,即伺服器無法與客戶端建立任意連接(例如,如果客戶端位於將它們分隔開的防火牆的內部),則來自客戶端的輪詢或持久連接客戶可能是要走的路。如果您的輪詢頻率很高,輪詢可能過於“昂貴”(從頻寬使用率的角度來看),但持久連接將需要周期性的“心跳”以使它們在有狀態的過濾設備中保持“活躍”。

沒有一刀切的解決方案。

引用自:https://serverfault.com/questions/639438