【发布时间】:2009-11-03 21:45:27
【问题描述】:
我正在寻找一种通过 Internet 处理大型数据集并定期更新这些对象的设计模式。我正在开发一个应用程序,它将一次在 UI 中显示数千条记录。此外,这些对象的各种属性非常短暂,需要在客户端上更新,以使用户了解系统中这些记录的变化状态。我对如何解决这个问题有一些想法,但我认为可能有一个(或多个)设计模式可以处理这种类型的场景。
限制:
- 客户端是用 Silverlight 编写的。
- 对象本身并不是很大(大约 15 个值类型和字符串属性),但是查询所有数据的开销很大。大约 15 个属性包含来自各种来源的数据;没有聪明的连接语句或索引会加速查询。我正在考虑在初始加载时仅填充属性的子集,然后在用户放大给定的对象分组时填写更昂贵的细节。想想 Google 地图,但不是街道和建筑,而是显示对象。
- 我将能够限制正在更新的数千个对象的部分。但是,我将需要用户能够“缩小”一个允许精细更新到显示所有数千个对象的上下文。我想当对象离开足够的缩放上下文时,更新将再次被禁用。
关于如何解决全部或部分问题的想法?就像我提到的那样,我已经在考虑一些想法,但到目前为止,我所做的一切都没有让我对这个项目的成功有很好的感觉。
编辑:
我认为困难的部分实际上归结为两件事,我可能需要两种不同的模式/实践/策略:
- 通过 Internet 加载大量记录 (~5k)。
- 通过 Internet 保持这些对象的子集 (~500) 保持最新。
有几种设计模式可以用于其他一切。
编辑 2:
感谢 Silverlight 中各种“推送”实现的链接。我可以发誓套接字已从 Silverlight 中取出,但根据下面的答案找到了 Silverlight 3 参考。无论如何,这对我来说真的不是一个大问题,而且我没有花太多时间研究,所以我正在从原始文本中编辑它。无论更新是通过投票还是通过推送,一般的设计问题仍然存在。很高兴知道我有选择。
编辑 3:推送技术的跟进。
我怀疑 Silverlight WCF 双工实现是comet-like push。这不会扩展,并且有很多文章介绍了它在现实世界中是如何扩展的。
Silverlight 中的套接字实现存在多种缺陷。看起来它在我们的场景中将毫无用处,因为 Web 服务器可能位于不允许非标准端口的任何给定客户端防火墙后面,并且 Silverlight 套接字不会连接到 80、443 等。
我仍在考虑以某种有限的方式使用 WCFduplex 方法,但看起来轮询将成为答案。
编辑 4:找到解决一半问题的模式
我发现 this pattern (PDF) 说明了使用迭代器模式从服务器检索数据页面并将它们呈现为简单的迭代器。在 .Net 领域,我想这将被实现为 IEnumerable(示例代码使用 Java 和 Oracle SQL)。我特别感兴趣的是异步页面预取,基本上是在客户端缓冲结果集。对于 5k 个对象,所有内容都无法立即显示在屏幕上,因此我可以使用一种策略,即不立即获取所有内容,但从 UI 中隐藏实现细节。应用程序将检索的核心对象位于数据库中,然后需要其他查找来完全填充这些对象。这种方法似乎是一种将一些数据快速发送给客户端的好方法。
我现在正在考虑使用这种模式 + 某种代理对象模式来侦听结果集的增量并相应地更新对象。在这里可以采取几种策略。我可以预先加载所有数据,然后发送更改的增量(这可能需要子系统中的一些额外代码来提供更改通知)。这可能是我的第一种方法。我还在寻找。感谢到目前为止的所有想法。
【问题讨论】:
-
非常有趣的问题!我一定会喜欢在某个时候从事这样的工作。我能问一下你正在建造什么的细节吗?
-
它是一个我们尚未发布(显然)的专有系统,因此我混淆了一些细节。一般来说,它是一种监控管理大量“设备”(当前最大安装量约为 5k)的应用程序中正在发生的事情的方法。该工具将允许管理员从整体上查看“设备网络”并发现问题,然后在问题区域采取行动。抱歉,我无法更具体。当我们发布时,我可以给你看!
标签: c# wcf silverlight design-patterns silverlight-3.0