第一次构建?

时间:2010-05-19 18:01:29

标签: wcf silverlight architecture

我最近被赋予了重建现有RIA的任务。我设计的新RIA基于Silverlight,具有连接到MS SQL Server的WCF服务。这是我第一次做这样的事情,所以我不确定如何设计整个事情。

基本上,客户可以浏览“股票”图表(允许客户选择不同的时间段,设置等)。我基本上编写了整个应用程序,但我不确定如何将它组合在一起。

图表应该直接基于数据库,并且要在图表上创建数据点,需要进行一些计算(不是非常昂贵的)。

我遇到的问题是决定在哪里进行计算(客户端或服务器端?或者一半还是一半?)

我应该寻找哪些因素来帮助我决定应该在哪里进行计算?我怎样才能优化这个(缓存等)?

显然这是一个非常广泛的主题,所以我不期待立即回答,但任何帮助/指向正确的方向/资源都将受到赞赏。

3 个答案:

答案 0 :(得分:4)

这类应用的一些提示。
在客户端上尽可能多地使用逻辑 让客户端负责会话数据,使所有服务器代码无状态 尽量减少进出服务器的流量(较大的请求比多个较小的请求更有效),因此尽可能合并请求。

答案 1 :(得分:3)

如果这个项目可能超出它当前的功能集,我认为执行计算客户端可能是一个好主意。这可以避免扩展问题,因为您使用的是所有客户端CPU,而不是单个宝贵的服务器CPU。但这依赖于能够以有效的方式将所需数据传输到客户端,否则您将网络瓶颈替换为处理器瓶颈。

至于缓存,取决于您的输入,客户端用户可以影响哪些变量?如果它们可以改变的任何变量是离散的(即它们可以是一组固定的值),那么它们就是缓存的候选者。例如,如果用户可以选择库存变化的日期范围来查看那么可能没那么有用,但是如果它们只能选择一年,那么您可以按年份缓存数据集(将每个数据集下载到客户端并执行计算)。我不担心缓存太多,除非你发现它是一个真正的性能问题,它只会使你的代码更复杂,所以在你已经证明你需要它之​​前不要添加它。

另外一件事,如果这个项目不太可能成为长期关注的问题,那么无论何时最简单,最快速地执行计算,您都可以重新审视项目是否会在以后变得更加重要。

答案 2 :(得分:2)

真的非常小心关于实现客户端缓存。在保持性能,安全性和正确性的同时,高速缓存 INSANELY 很难做到。请注意,您的数据库服务器的缓存机制已经可能比您在不到两周的时间内实施的任何本地缓存机制更好!

我建议您尽可能多地在后端执行操作,并限制客户端以适合您的用户的方式呈现数据。虽然许多人可能对这一建议不屑一顾,但它基于过去建立许多此类系统的一些观察结果:

  • 如果您要过滤服务返回的部分数据,那么您只需浪费数千个时钟周期即可运送绝不需要离开服务器的数据
  • 如果您要对数据进行排序,那么您的数据库可能已经为您排序(通常使用其他空闲的CPU标记),同时等待从其磁盘读取数据。
  • 您的服务器最有可能拥有比您的客户端更多的CPU和RAM,并且在等待磁盘读取扇区等时,有大量的“空闲时间”用于排序,过滤,运行内联计算等。

罗马建议:尽可能减少客户与服务器之间的往返行程。

但也许最重要的是:

  1. 在开始设计系统之前,说明您的绩效目标
  2. 设计您认为将实现这些目标的内容。尝试找到设计中的瓶颈,特别是阻止呼叫的区域。在任何地方重新设计这些区域以使用异步模式。
  3. 构建您的预期解决方案
  4. 在实际实际负载下测量您的实际性能
  5. 如果您符合预期的绩效目标,那么您已经完成了。
  6. 如果没有,找出你花费太长时间的地方并调整系统那部分的设计。转到3。
  7. 不要试图一次性构建完美的系统 - 由于各种原因(包括用户期望,服务器处理所需负载的能力),无论您如何努力,都无法管理它,您的客户处理返回数据的能力,您的网络承载流量的能力等等。

    他们现在有点老了,但我建议你阅读http://blogs.msdn.com/richardt上的一些早期帖子,了解有关设计和构建面向服务和分布式系统的更多想法。