什么是推/拉数据流模型的优缺点?

时间:2009-06-11 13:19:44

标签: data-structures push pull

我一直在开发一个内部DSP应用程序(用于Groovy / Jython / JRuby的Java w / hooks,通过OSGi的插件,大量的JNI),数据流/图表样式,类似于纯数据和simulink 。我目前的设计是推模型。用户与某个源组件交互,导致它将数据推送到下一个组件,依此类推,直到结束块(通常是显示器或文件写入器)。这种设计存在一些独特的挑战,特别是当组件需要输入时。没有简单的方法来请求更多输入。我已经通过反馈控制流来缓解了一些这种情况,例如,FFT块可以广播它需要更多数据来源它的链块。我已经考虑过将组件的支持添加为推/拉/两者。

我正在寻找关于push vs pull vs both / hybrid的优点的回应。你之前做过这个吗?什么是“陷阱”?你是怎么处理的?这个问题有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

在大型产品中采用“主要拉动”方法的一些经验:

模型:节点构建1:N树,即每个组件(根除外)有1个父节点和1..N个子节点。数据几乎完全从父母流向儿童。更改通知可以来自树中的任何节点。

实施:通过发送节点的id和“生成”计数器通知所有叶子。 Leafs知道他们依赖哪个节点路径,因此他们知道他们是否需要更新。 (任何其他子节点更新算法也会这样做,事后看来可能更好)。

Leafs查询其父级以获取当前数据,以递归方式查询冒泡。包括生成计数器,因此起泡停止在始发节点处。

优点:

  • 父节点不需要太多/任何有关其子节点的信息。任何人都可以使用数据 - 这允许通用方法在用于显示的数据之上实现一些(最初不是预期的)非UI功能
  • 子节点可以聚合并延迟更新(避免重绘确保快速绘画)
  • 非活动叶子确实不会导致任何数据流量

缺点

  • 随着完整数据的发布,增量更新非常昂贵。 实现实际上允许请求不同的数据包(和 生成计数器可以防止不必要的数据流量),但最初设计的数据包非常大。切片它们是事后的想法,但工作正常。
  • 你需要一个真正良好的生成机制。最初实现的一个与初始更新(需要特殊处理 - 请参阅“增量更新”)和更新聚合
  • 相冲突
  • 对于 up 树的数据的需求被大大低估了。
  • 只有当节点提供对当前数据的只读访问权限时,
  • 发布才是便宜的。这可能需要额外的更新同步,但
  • 有时您希望中间节点更新,即使所有叶子都处于非活动状态
  • 一些叶子最终实现了轮询,一些基本节点最终依赖于它。难看。

一般而言:

当数据和处理层对UI一无所知时,Data-Pull“感觉”对我来说更具原生性。但是,它需要复杂的变更通知机制来避免“更新宇宙”。

Data-Push简化了增量更新,但前提是发件人非常了解接收者。

我没有使用其他型号的相似规模的经验,所以我无法真正提出建议。回想起来,我看到我主要使用拉力,这不是一件麻烦事。看到其他人的经历会很有趣。

答案 1 :(得分:0)

我在一个纯拉图像处理库上工作。它更适合于批量式操作,我们不需要处理动态输入,因此它似乎运行良好。 Pull特别适用于大型数据集和线程:我们线性扩展至至少32个CPU(取决于所评估的图形,当然,heh)。

我们有一个GUI,允许叶子是动态数据源(例如,提供帧的摄像机),并通过丢弃和重建图形的相关部分来处理它们。在我们的情况下这很便宜,所以开销不是那么高。