2012-03-31 33 views
3

我正在開發的系統可能有非常大量的客戶端(可以說有一百萬)需要定期用一些信息更新中央服務器。客戶端用Java編寫。如何知道廣域網IP是否發生了變化並接收到大量的IP地址廣播

具體的用例是服務器後端需要IP地址的最新映射到客戶端。但客戶IP是動態的並且受到(有效的隨機)更改。

我想到的解決方案需要客戶端ping服務器以更新其IP。理想情況下,這個時期應該是每分鐘一次,但即使是1平/ 10分鐘也是可以接受的。

我的問題,在序列:

  1. 每1分鐘1M坪超過10K /秒。 所以首先我想知道 這些方法可以擴展來處理這樣的負載。這是要知道可用的選項。

  2. 假設你有多種解決方案,其中哪一種 最經濟? 成本效益至關重要。我沒有自己的數據中心或網絡上的靜態和胖端點,所以服務器應用程序將 需要在某種提供商上運行或最終在雲上運行。

注:

  • 我認爲用我自己的ISP提供的連接離家服務器,但我既不是肯定的性能問題,也沒有人知道我的ISP會去想絡繹不絕的ping。

  • 我看不到服務器如何自動發現這些IP更改。

+1

他們爲什麼需要將他們的IP地址發送到服務器? – 2012-03-31 11:37:35

+0

因爲我有移動設備連接到計算機,他們需要查詢上述服務器的計算機IP地址。由於計算機無法建立與設備的連接,設備需要啓動套接字連接 – Erik 2012-03-31 11:44:01

+0

上述移動設備需要做什麼? – 2012-03-31 11:45:21

回答

2

埃裏克,你的問題似乎比簡單得多已發出聲音。

這個問題已經存在了十年,也許兩年。這裏不需要重新發明輪子。

爲什麼輪詢/ ping命令是一個壞主意

由互聯網服務供應商所提供的動態IP可以具有可變的租用時間,但通常是至少24-72小時。每隔1到1米對服務器進行一次屏蔽就會造成可怕的資源損失,這可能會在72小時內造成4320個無用的HTTP請求。每個請求會說約300字節* 4,320浪費的http請求等於1。3mb浪費帶寬乘以100萬客戶端的目標客戶端數量,您正在談論的是一個每月浪費的帶寬約爲1.2 TB!這就是浪費的帶寬,而不是運行應用程序所需的其他帶寬,並提供有用的信息。

客戶需要比經常ping的更聰明。相反,他們應該能夠在啓動時檢查其IP地址是否與DNS匹配,然後只有在IP更改時才向服務器發送通知。這將減少數千倍的帶寬和服務器處理需求。

你所描述的動態DNS

是什麼,你所談論的「動態DNS」(既爲技術的描述性名稱,也一個公司,提供SaaS解決方案的名稱)。

動態DNS是一個非常簡單的DNS服務器,可以讓您快速更改名稱和IP地址之間的映射。通常這對於使用僅提供動態IP的ISP的設備很有用。只要動態IP上的路由器/服務器的IP發生變化,它就會通知動態DNS服務器該變化。

  • 動態DNS的實際標準協議已有詳細記錄。從這裏開始:DNS Update API,我認爲你正在尋找的細節在這裏:DynDNS Perform Update。由於路由器硬件通常都有內置的DynDNS客戶端,每個人都想使用,所以大多數商業實現都非常接近相同的協議。
  • 大多數路由器(甚至便宜的)都已經內置了動態DNS客戶端。 (您可以編寫自己的軟客戶端,但路由器可能是最有效的位置,因爲您的客戶端可能使用私有IP進行NAT轉換 - 您仍然可以這樣做,但需要花費更多的帶寬用於公共IP發現)
  • 快速谷歌搜索「動態DNS Java客戶端」帶來了完整的源項目,像這樣的:Java DynDNS client(未經測試,只是說明搜查的權力)

其他注意事項您的系統架構

可以說IP客戶端映射的東西得到解決。你把它全部搞清楚了,它完美地工作,你總是知道每個客戶端的IP。你會有一個很好的可靠系統,用於從移動設備向客戶端傳輸文件嗎?我會說不。

手機和家用電腦都可以有多種連接類型,Wi-Fi,蜂窩數據,也許有線數據。這些網絡中的每一個都可能有不同的安全系統。因此,從蜂窩數據移動設備到家用路由器後面的WiFi筆記本電腦的連接將與​​連接到同一WiFi網絡上的筆記本電腦的WiFi移動設備看起來非常不同。

您可能需要與物理路由器防火牆進行抗衡。此外,家用電腦可能會啓用Windows防火牆,可能是諾頓互聯網安全,可能是賽門鐵克,也許AVG,也可能是防區警報等等。您是否知道所有這些潛在客戶的防火牆考慮因素?

+0

感謝您的分解。你的DNS解決方案應該可以工作。所有客戶都將查詢相同的dyndns帳戶。並可以通過這樣做來了解IP是否已經改變。這是你最初的意思嗎?這樣客戶端只會在ip改變的情況下ping服務器。關於防火牆問題以及每個java客戶端如何獲得入站連接,我認爲UPnP可能可以用來創建端口轉發,但不確定。這個想法是,客戶端程序安裝在一臺固定的家用電腦上。如果他們將它安裝在ip跳轉一整天的Wi-Fi筆記本電腦上,他們不得不在該筆記本電腦上安裝客戶端。 – Erik 2012-05-02 16:41:32

2

也許你可以使用SIP作爲協議的目的? 可能是java的SIP庫已經解決了你的問題。

不錯的應用程序。

+0

將在SIP上讀取 – Erik 2012-04-20 15:23:00

1

我會建議更好的調整你的Java程序來知道IP更改,然後只打網絡服務。

你可以不喜歡它,

  1. 在Java程序啓動提取機的IP和存儲 它在全局變量或更好一些屬性文件。
  2. 運行批處理程序/ 調度程序它將每30秒/ 1分鐘檢查您的IP以進行更改。 Java Quartz Scheduler對你來說非常方便。
  3. 在IP更改的情況下調用Web服務。

這樣可以減少您的服務器角色,從而減少流量和連接。

+0

這隻有在計算機直接連接到互聯網並因此具有WAN IP時才起作用。煽動感謝 – Erik 2012-05-02 17:19:14

0

請看看沒有ip的工作原理。您的要求與其所做的完全相同。

0

我有用例嗎?一個用戶社區都希望彼此接收圖片?您不想將圖像託管在服務器上,而是直接將其廣播給所有用戶?

這裏有兩個問題。第一個問題是「如何知道我自己的WAN IP地址是否已經改變。」

如果你不經過NAT則:

InetAddress.getLocalHost() 

會告訴你,你的IP地址。

如果你是NAT,那麼使用動態DNS和解析你自己的主機名將會起作用。

第二個問題類似於「如何在互聯網上來去的主機之間共享圖片」。

的可能的解決方案空間包括:

IP組播,可能與前向糾錯和Carouseling,例如長笛。

File Swarming - 例如BitTorrent的。

使用Jabber,AMQP,JMS,STOMP或類似方法發佈/訂閱消息總線解決方案。合適的實現包括RabbitMQ,ActiveMQ等。JMS主題是這裏的一個關鍵概念。

該解決方案應該避免在IP級別處理大量開銷。

+0

。得到這樣的評論真的很花時間。我有一個閱讀嚕嚕:)文件不被直接發送的原因是因爲大多數移動設備將具有片狀網絡。通過這種方式,發送/接收設備將連接到一個無碎片的服務器,並提高發送/錄製速度。我知道有更好的方法,這是我知道的最好的方法 – Erik 2012-05-02 16:58:41

+0

動態DNS在這裏並沒有真正的幫助 - 服務器的IP和DNS是靜態的和已知的。它是一個publsh /訂閱問題。如果您認爲網絡在數據包丟失的意義上是片狀的,那麼您可能需要前向糾錯(FLUTE是一種規範的解決方案),但實際上這也看起來像文件羣集場景(例如bittorrent)。還可以通過文件傳輸查看聊天應用程序。 – Julian 2012-05-02 17:25:29

+0

我以爲計算機java客戶端可以ping一個dyndns並得到回覆,因此讀取自己的廣域網ip地址。然後客戶端不必每隔60秒就會ping服務器,只有當WAN IP發生變化時才能ping服務器。也許我在錯誤的水中釣魚.. – Erik 2012-05-02 18:10:34

1

您可以在UDP之上創建自己的協議,例如基於XML的協議。定義3個信息:

  • 請求 - 客戶機請求來自服務器的詢問
  • 挑戰 - 服務器挑戰應答(基本上是隨機數)
  • 響應 - 客戶端發送的用戶名和散列密碼+挑戰回服務器

它重量輕,不太流量。您可以將其負載平衡到任何層的多個服務器或使用負載平衡器。

任何普通的PC能處理每分鐘萬個這樣的命中率,只要你在C/C做服務器端++(我不知道關於Java的網絡性能)

+0

我同意UDP在這裏是明智的選擇。 +1(僅供參考,Java網絡性能非常好,唯一的問題是在預算上運行JVM會導致預算託管選項的內存配額崩潰。) – alphazero 2012-04-22 14:49:47