在大规模商品的“大多 - 拉”方法的一些经验:
型号:节点建立一个1:N树,即,每个组分(除了根)具有1个父和1 ..N个孩子。数据几乎完全从父母流向儿童。更改通知可以源自树中的任何节点。
执行:通过发送节点的ID和“生成”计数器通知所有叶子。 Leafs知道他们依赖哪个节点路径,所以他们知道他们是否需要更新。 (任何其他的子节点更新算法也会这样做,事后看来可能会更好)。
叶子查询他们的父母的当前数据,递归查询气泡。生成计数器包含在内,所以起泡停止在起始节点。
优点:
- 父节点并不需要太多的/他们的孩子的任何信息。数据可以被任何人使用 - 这允许通用的方法来实现用于显示的数据之上的一些(最初不期望的)非UI功能
- 子节点可以聚合和延迟更新(避免重绘确实节拍快速绘画)
- 不活动的叶子做不会造成数据流量在所有
缺点:
- 增量更新是昂贵的,因为完整的数据公布。 实现实际上允许请求不同的数据包(并且 生成计数器可以防止不必要的数据流量),但最初设计的数据包非常大。切片他们是事后想法,但工作正常。
- 您需要一个真正好的生成机制。最初实现的那个与初始更新(需要特殊处理 - 请参阅“增量更新”)和更新的聚合相冲突
- 需要数据传输up该树被大大低估了。
- 仅当节点提供对当前数据的只读访问时,发布才是便宜的。这可能需要额外的更新同步,尽管
- 有时您希望中间节点更新,即使所有叶子都不活动
- 某些叶子最终实现了轮询,但一些基节点最终依赖于此。丑陋。
一般:
数据拉“感觉”对我来说更原生时的数据和处理层竟然一无所知的用户界面。但是,它需要一个复杂的更改通知机制来避免“更新宇宙”。
Data-Push简化了增量更新,但只有当发送者非常了解接收者时。
我没有使用其他模型的类似规模的经验,所以我不能真正推荐。回顾一下,我发现我主要使用拉,这是一个麻烦。看到其他人的经验会很有趣。
因为这主要是拉,你的树的根节点是流/链中的最后一个节点吗?是否有可能有多个终端节点(多个显示器)? – basszero 2009-06-11 14:42:57