在大規模商品的「大多 - 拉」方法的一些經驗:
型號:節點建立一個1:N樹,即,每個組分(除了根)具有1個父和1 ..N個孩子。數據幾乎完全從父母流向兒童。更改通知可以源自樹中的任何節點。
執行:通過發送節點的ID和「生成」計數器通知所有葉子。 Leafs知道他們依賴哪個節點路徑,所以他們知道他們是否需要更新。 (任何其他的子節點更新算法也會這樣做,事後看來可能會更好)。
葉子查詢他們的父母的當前數據,遞歸查詢氣泡。生成計數器包含在內,所以起泡停止在起始節點。
優點:
- 父節點並不需要太多的/他們的孩子的任何信息。數據可以被任何人使用 - 這允許通用的方法來實現用於顯示的數據之上的一些(最初不期望的)非UI功能
- 子節點可以聚合和延遲更新(避免重繪確實節拍快速繪畫)
- 不活動的葉子做不會造成數據流量在所有
缺點:
- 增量更新是昂貴的,因爲完整的數據公佈。 實現實際上允許請求不同的數據包(並且 生成計數器可以防止不必要的數據流量),但最初設計的數據包非常大。切片他們是事後想法,但工作正常。
- 您需要一個真正好的生成機制。最初實現的那個與初始更新(需要特殊處理 - 請參閱「增量更新」)和更新的聚合相沖突
- 需要數據傳輸up該樹被大大低估了。
- 僅當節點提供對當前數據的只讀訪問時,發佈纔是便宜的。這可能需要額外的更新同步,儘管
- 有時您希望中間節點更新,即使所有葉子都不活動
- 某些葉子最終實現了輪詢,但一些基節點最終依賴於此。醜陋。
一般:
數據拉「感覺」對我來說更原生時的數據和處理層竟然一無所知的用戶界面。但是,它需要一個複雜的更改通知機制來避免「更新宇宙」。
Data-Push簡化了增量更新,但只有當發送者非常瞭解接收者時。
我沒有使用其他模型的類似規模的經驗,所以我不能真正推薦。回顧一下,我發現我主要使用拉,這是一個麻煩。看到其他人的經驗會很有趣。
因爲這主要是拉,你的樹的根節點是流/鏈中的最後一個節點嗎?是否有可能有多個終端節點(多個顯示器)? – basszero 2009-06-11 14:42:57