2016-07-28 93 views
2

設計廣播消息給客戶

服務器代理保持輪詢數據庫(SQL Server 2012的)上如果有一個客戶端代理需要調度和/或配置進行任何更改。客戶端代理在網絡上的所有計算機上運行,​​並需要從服務器代理獲取更新的掃描計劃和配置,並更新其作業計劃程序。服務器代理和客戶端代理均使用Java構建。

問題陳述

服務器,一旦數據庫被更新的數據發送到客戶端代理的n個。

解決方法1

創建服務器和客戶端代理web服務和消耗對方。每當數據庫中的掃描計劃/配置發生變化時,服務器都會調用客戶端代理的方法並更新配置文件。

缺點解決方法1

在運行的JAR,在所有客戶端代理部署的Axis2 /碼頭/類似webserrver。考慮到這是在所有客戶端代理上部署Web服務器的人數可以達到150000,這是可取的嗎?另外,如果所有客戶機上都有Web服務器,應用程序是否可以清除安全認證?

溶液2

使用RMI服務器和客戶端之間的通信。在這種情況下,客戶端將保持輪詢服務器,因爲RMI通信是單向的。應該避免使用雙向呼叫,因爲它再次涉及每個客戶端機器上的服務器套接字。

缺點溶液2

每當DB被更新,它不能直接發送消息給所有的客戶機。它必須等待客戶端機器進行輪詢。如果需要立即掃描,所有客戶端代理將需要經常輪詢主代理。考慮到客戶端代理的數量可能會很大,這是可取的嗎? Java架構師通知的另一個缺點是RMI比web服務慢。那是對的嗎?

我必須去這兩個解決方案,或者如果有任何第三個解決方案,你們可以給我。有人還建議將JMS作爲廣播方式。

回答

0

您的解決方案1有另一個問題 - 每個人都知道服務器,但服務器不會知道所有的客戶端。當然,你可以在服務器上做一個客戶端註冊工作流程,但是它會讓服務器很沉重地發佈消息

我甚至沒有在這裏考慮解決方案2。對我來說,RMI和死亡一樣好,我們現在有更好的架構。

  1. 調用訂閱模型中的消息隊列。只要有更新將消息推送到隊列管理器,並讓隊列管理器擔心廣播到所有可用的客戶端。您可以在這裏使用任何可靠的隊列,例如RabbitMQ,MQTT等。

主要優點是消息傳遞的可靠性。有選擇可以確保每個用戶都能收到這條消息,這很好。如果需要,可以稍後進行推/拉。您還可以羣集郵件隊列如果客戶端數量繼續走高,在以後的時間點,這將創建一個負載平衡的解決方案。

  • 也可以使用一個WebSocket的,如果要求傳輸的速度。但由於其資源使用情況,這不如選項1好。但是,如果你不擔心它,websockets是全雙工通信的超酷方式。
  • +0

    我們的設計師團隊想出了一個解決方案,因爲只有在服務器和代理客戶端代理爲web服務將繼續輪詢服務器代理定期。這樣,它就避免了在所有遠程代理上使用Web服務器。 JMS也被考慮在內。這是最好的解決方案之一。然而考慮到給定的解決方案滿足項目的所有要求,JMS被忽視了。儘管謝謝你的回答。它鼓勵我們進行更多的辯論和分析。 –