首次架构设计?

3
我最近被分配任务重建一个现有的RIA。我设计的新RIA基于Silverlight,使用WCF服务连接MS SQL Server。这是我第一次做这样的事情,所以我不确定如何设计整个系统。
基本上,客户端可以查看“股票”图表(允许客户端选择不同的时间段、设置等)。我已经基本编写了整个应用程序,但我不确定如何将其组合在一起。
图表应该直接基于数据库,并且为了在图表上创建数据点,需要进行一些计算(不是非常昂贵的计算)。
我遇到的问题是决定在哪里放置计算(客户端还是服务器端?还是二者兼而有之?)
我应该寻找哪些因素来帮助我决定在哪里进行计算?我如何优化它(缓存等)?
显然,这是一个非常广泛的主题,所以我不指望立即得到答案,但任何帮助/指引正确方向/资源都将不胜感激。
3个回答

4

针对这种应用,有几个小建议。
尽可能将逻辑放在客户端上。
让客户端负责会话数据,使所有服务器代码无状态。
尽量减少与服务器之间的流量(较大的请求比多个较小的请求更有效),因此请在可能的情况下合并请求。


3
如果这个项目可能会超出当前的功能范围,我认为在客户端执行计算可能是一个好主意。这可以避免扩展问题,因为您使用了所有客户端CPU而不是单个宝贵的服务器CPU。但是,这需要以高效的方式传输所需数据到客户端,否则您将用网络瓶颈代替处理器瓶颈。
至于缓存,这取决于您的输入,客户端用户可以影响哪些变量?如果他们可以更改的任何变量都是离散的(即它们可以是一组固定值),那么它们就是缓存的候选对象。例如,如果用户可以选择查看股票变化的日期范围,那么这可能没有那么有用,但是如果他们只能选择一年,则可以按年缓存数据集(下载每个数据集到客户端并执行计算)。除非发现真正存在性能问题,否则不要过多担心缓存,这只会使您的代码更加复杂,因此请在证明需要之前不要添加它。
还有一件事,如果这个项目不太可能成为长期关注点,请在最容易和最快的地方实施计算,如果项目后来变得更加重要,您可以重新审视它。

2
非常小心地实现客户端缓存。缓存很难做到正确,同时保持性能、安全和正确性。请注意,您的数据库服务器的缓存机制已经比您在不到2周的时间内实现的任何本地缓存机制要好得多!
我建议您尽可能在后端完成更多的工作,并限制客户端以适合用户的方式呈现数据。虽然许多人可能会反对这种建议,但它基于过去构建许多这样的系统的观察:
- 如果您要过滤返回的某些数据,则浪费了成千上万个时钟周期来传输永远不需要离开服务器的数据。 - 如果您要对数据进行排序,则您的数据库可以为您执行排序(通常使用闲置的CPU时钟),而等待从磁盘读取数据。 - 您的服务器很可能比您的客户端具有更多的CPU和RAM,并且在等待磁盘读取扇区等操作时有惊人的“空闲时间”可用于排序、过滤、运行内联计算等。
如Roman所建议的:尽可能减少客户端和服务器之间的往返次数。
但是最重要的是:
  1. 在设计系统之前,先确定您的性能目标。
  2. 设计能够实现这些目标的方案。尝试找出设计中的瓶颈,特别是在进行阻塞调用的地方。重新设计这些区域,尽可能使用异步模式。
  3. 构建您打算实现的解决方案。
  4. 在实际负载下测量实际性能。
  5. 如果您达到了预期的性能目标,那么就完成了。
  6. 如果没有,找出花费太长时间的地方,并调整该部分系统的设计。返回步骤 3。
不要试图一次性构建完美的系统 - 不管您多努力,由于各种原因(包括用户期望、服务器处理所需负载的能力、客户端处理返回数据的能力、网络承载流量的能力等),您都有可能无法做到。
它们已经有点过时了,但我建议您阅读http://blogs.msdn.com/richardt的一些早期文章,以获取更多关于设计和构建面向服务和分布式系统的思路。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接