2012-04-17 149 views
3

我正在努力在Go中本地創建一個Pastry版本。從design [PDF]:確定請求延遲

假設應用 提供了一種功能,允許每個糕點節點,以確定與給定的IP地址給其自身的一個節點 的「距離」。具有較低距離值的節點假定爲更合乎需要的 。預計應用程序將根據其接近度量指標的選擇,使用網絡服務(如跟蹤路由或Internet子網地圖)和適當的緩存和近似技術來最小化開銷來實現此功能。

我想弄清楚什麼是最好的方式來確定兩個EC2實例之間的「鄰近」(即網絡延遲)編程從Go。不幸的是,我對低級網絡不夠熟悉,無法區分我可以使用的不同類型的請求。谷歌搜索沒有提出任何關於測量Go延遲的建議,而一般的延遲技術似乎總是Linux二進制文件,我希望以更少的依賴性爲名避免。任何幫助?

另外,I note表示兩個EC2實例之間的延遲應該在1ms的範圍內。雖然我計劃在EC2上使用這個實現,但它可以假設在任何地方都可以使用。延遲通常非常糟糕,我應該花費精力確保兩個節點的網絡接近度?請記住,大多數Pastry請求可以以羣集中服務器數量的16位爲單位(對於10,000臺服務器,平均需要大約3次請求才能找到要搜索的密鑰)。例如,從EC2的亞太地區到EC2的美國東部地區的延遲是否足以證明增加節點時增加的複雜性和延遲檢查帶來的開銷?

+1

如果不知道自己的目標,就不可能回答這些問題是否有必要/值得。你有特定的延遲目標嗎?您是否想盡量減少EC2區域之間的通信帶寬成本? – 2012-04-19 02:55:10

+0

我試圖在通信延遲和帶寬使用之間做出智能權衡。沒有超出「合理」範圍的延遲目標。這很複雜,因爲我想將其作爲通用包發佈,因此它不能是EC2特定的。 – Paddy 2012-04-22 20:31:37

回答

5

網絡中的公共距離度量是計算數據包需要到達目的地的跳數(節點跳數)。這個指標在您引用的文字中也有提及。即使您提到的低延遲環境(EC2「本地」),這也可以爲您提供足夠的距離值。

對於go邏輯本身,人們會認爲net是您正在尋找。事實上,對於延遲測試(ICMP PING),你可以用它來創建一個IP連接

conn, err := net.Dial("ip4", "127.0.0.1") 

創建ICMP包結構和數據,併發送。 (請參閱Wikipedia page on ICMP; IPv6需要不同的格式。)不幸的是,您不能直接創建ICMP連接,就像使用TCP和UDP一樣,因此您必須自己處理包結構。

由於conn的類型ConnWriter,您可以將它傳遞給您的數據,您定義的ICMP數據。

ICMP類型字段中,您可以指定消息類型。值8,1和30是你正在尋找的。 8爲您的回聲請求,答覆將是類型1.也許30給你一些更多的信息。

不幸的是,對於計數網絡跳數,您將需要IP數據包頭字段。這意味着,您將必須構建您自己的IP數據包,其中net似乎不允許。

檢查source of Dial(),它使用internetSocket,這是不導出/公開。我不確定我是否缺少某些東西,但似乎沒有簡單的方法來構建自己的IP數據包來發送,並具有可定製的標題值。您需要進一步檢查DialIP如何使用internetSocket發送軟件包,並複製並修改該代碼/概念。另外,你可以使用cgo和一個系統庫來構建你自己的包(儘管這會增加更多的複雜性)。

如果您打算使用IPv6,您將(也)必須考慮ICMPv6。兩個軟件包的v4版本都有不同的結構。


所以,我建議使用簡單的延遲(定時平)作爲一個簡單的(R)執行,然後在以後的時間/添加節點跳之後,如果你需要它。如果你們有兩個,也許你們也想把這兩個結合起來(跳少跳並不自動意味着更好;認爲長期的海外電纜等)。

+0

考慮使用原始系統調用。 – 2012-04-18 09:20:06

+0

@ElazarLeibovich你可以擴展嗎? – Paddy 2012-04-22 20:31:58

+2

@PaddyForan調用'syscall.Socket(syscall.AF_INET,syscall.SOCK_RAW,port)',那麼你應該可以自己構造ICMP數據包。 – 2012-04-23 08:57:42