ZeroC Ice傳送大資料

2022-07-06 20:12:12 字數 1433 閱讀 3282

繼上文,我們使用zeroc ice傳遞大塊資料時,通常有兩種做法,一種是一次請求,另一種就是分多次請求(,這種做法在官方文件有例子)。選哪一種根據需要而定。

當分多次請求來完成一大塊資料,到底選擇每次請求多大的資料合適呢?

首先清楚下面幾點,每次請求應該用 two-way進行,也就是 request - reply 模式來確保資料傳送。one-way模式是只管單向傳送的。那麼就有下面幾個點

乙個最小的ice reply包大小為 79

乙個ice心跳包大小為 68

乙個分段的ack包大小為 60

無論是返回 void的 reply包,還是心跳包,都必須通過 ice環境和 ice協議,也就是必須通過 poll_out事件,喚醒執行緒池去傳送。這裡有隱藏的問題,在某些機器上的linux,poll_out事件並不正常工作。

分段的ack動作,完全由協議棧的tcp驅動完成,不會像應用層依賴epoll事件去傳送資料,受poll_out事件不正常而影響。

如果一次請求過小,我們假定為了迎合鏈路去傳送資料,將一次請求的資料量定為小mtu,假設是1k,那麼每傳送1k就要接收端在應用層響應並通過 ice環境(epoll執行緒池)傳送乙個reply包,最小體積為 79。

為了減少接收端頻繁在應用層響應,(最主要還是epoll 等待的poll_out事件),我們就要適當增加一次請求的資料體積。這時候tcp層就需要將請求包分段傳送,當請求包大小剛好跨越 mss限制時,這樣就會造成浪費,剩下的小部分資料不得不進行一次分段。為了提高利用,最好就是一次請求在 mss 限制內盡可能的大, 最好是mtu的倍數。

從上面的例圖,乙個10k分段的ack包,在1300地遞增,也就是分段以多個ip包,每個1300地到達接收端。並且到達是不按時間順序的,但是接收端可以重組這個分段的ip包。分段的ack包的seq並沒有任何改變,視窗也不會變化。

這裡就有一問題,我們必須查詢 socket 的 mtu 以及 mss,但是 zeroc ice完全將底層 socket 與使用使用者隔離,所以當你使用這個中介軟體後,你就不得不忍受這種封裝。

另外再次聲討一下,sequence在所有平台上工作良好,除子php平台上,是雞肋的整數陣列,這最少要損耗10倍的空間。

2018.02.14 補充:

ice.messagesizemax是接收方的限制屬性,當乙個twoway請求,client 和 server都扮演一次接收方。client request to server,server 就是 request message 的接收方。server reply to client,client 就是 reply message 的接收方。當請求或響應的訊息包的資料太大時,都要調整兩邊的 ice.messagesizemax。當你在一方捕捉到關於這個屬性的異常,不是限制了傳送,而是限制了接收,換句話說不是發不出去,而是拒絕了接收從對方來的訊息。

socket對於大資料的傳送和接收

大資料是指大於32k或者64k的資料。大資料的傳送和接收通過tstream物件來進行是非常方便的。我們把大資料分割成乙個個4k大小的小包,然後再依次傳輸。一 大資料的傳送的類語言描述 1 建立流物件,用流物件一次性地載入完大資料 2 移動流的position,一次將流的4k大小的一塊記憶體讀進一塊b...

一文讀懂大資料開發 送給大資料開發初學者

商業價值高,但是這種價值需要在海量資料之上,通過資料分析與機器學習更快速的挖掘出來 處理時效性高,海量資料的處理需求不再侷限在離線計算當中。mapreduce hdfs namenode datanode jobtracker tasktracker yarn resourcemanager nod...

大資料 什麼是大資料

1.什麼是資料 資料是事實或觀察的結果,是對客觀事物的邏輯歸納,是用於表示客觀事物的未加工的原始材料。資料經過加工之後就成為資訊。2.大資料的定義 麥肯錫給出的大資料定義是 大資料是指大小超過常規的資料庫工具獲取 儲存 管理和分析能力的資料集。但它同時強調,並不是說一定要超過特定的tb值的資料才能是...