2011-03-03 87 views
1

我想允許一組進程能夠相互通信。流程可以隨時隨地進行,並且沒有明顯的「主要」或「服務器」流程,因此流程確實需要能夠以完全對等的方式進行通信。。進程集羣之間的網絡點對點通信

我理解進程間通信和不同的通信方法(TCP,命名管道等),但我不太瞭解對等集羣是如何工作的,特別是每個客戶端如何有效地確定列表其他客戶。

使用現有技術在.Net中實現這一點有什麼方法嗎? (例如WPF)

如果沒有,我應該在哪裏查找有關對等通信協議的信息?

回答

3

BitTorrent協議的分佈式對等網絡協作的研究可能會是一個很好的起點:http://www.bittorrent.org/beps/bep_0003.html

其他系統的調查可能是Tor的分佈式匿名網絡,和Windows互聯網名稱服務(WINS)。這些都涉及同行的發現和協調在一定程度上。

建立P2P羣集最棘手的部分可能是找出一個新對等點發現對等羣集的可靠方法。使用預定義的TCP端口號將是一個開始,但是當該端口已被其他進程使用時,該端口會分開。您可以使用UDP廣播來確定是否存在任何對等點,但這不會跨越您的第一個路由器跳躍,因爲路由器通常會過濾廣播以防止廣播傳播風暴。您可以使用集中的跟蹤器/分派器,但這會成爲整個對等集羣的單點故障。

網絡拓撲結構也會影響您的發現方法。如果所有的對等體都在同一個網段內,或者在同一個防火牆後面,你可以做任何事情。但是,如果某些對等設備位於防火牆之後,則無法通過防火牆啓動與它們的連接 - 它們必須啓動與您的連接,或使用UPNP在防火牆中打開傳入端口。

發現是BitTorrent系統中最薄弱的部分。除非用戶知道要使用哪個torrent目錄或跟蹤器URL,否則torrent客戶端是無用的。一旦找到節點,找到對等集羣中的任何節點,找到集羣的其餘成員都相對簡單。

如果你的進程集合全部駐留在同一臺物理機器上,你可以使用類似消息隊列服務的東西充當瞬態進程之間的第三方仲裁器。否則,您可能正在考慮讓對等組中的某個進程擔當領導職位來回答發現請求並將對等列表分發給其他人。當牽頭流程需要執行時,它可以將牽頭移交給其他對等方之一,或者對等方可以使用分佈式對等方列表故障轉移到新的牽頭流程。這基本上是Windows名稱服務(WINS)爲NetBios名稱發現所做的。

+1

當您知道所有對等設備都在本地計算機上時,是否有任何方法可以簡化客戶端發現問題? – Justin 2011-03-03 05:46:04

+0

是的,知道所有對等設備位於同一臺計算機上可以極大地減少問題集,因爲您不必處理路由器和防火牆,並且可以利用TCP/IP中不可用的操作系統全局名稱服務。命名管道是點對點的 - 它們不能有多個監聽器。 – dthorpe 2011-03-03 06:02:18

+3

你最好的選擇是使用命名的共享內存+名爲mutex,併爲你所選擇的唯一預定義名稱向所有同行所知。用它來發現集羣成員資格。一個新的對等體通過獲取指定的互斥體來加入羣集,從共享內存區域讀取連接信息列表,將自己的連接信息寫入列表末尾,然後釋放互斥鎖。新的同級現在有一個集羣成員的目錄。有些條目可能過時,因此預計連接失敗。定期在互斥量下更新共享內存以清除陳舊條目。 – dthorpe 2011-03-03 06:18:22