Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 第一次架构?_Wcf_Silverlight_Architecture - Fatal编程技术网

Wcf 第一次架构?

Wcf 第一次架构?,wcf,silverlight,architecture,Wcf,Silverlight,Architecture,我最近接到了重建现有RIA的任务。我设计的新RIA基于Silverlight,带有连接到MS SQL Server的WCF服务。这是我第一次做这样的事情,所以我不知道如何设计整个东西 基本上,客户端可以查看“股票”图表(允许客户端选择不同的时段、设置等)。我基本上已经编写了整个应用程序,但我不知道如何将其组合起来 这些图应该直接基于数据库,要在图上创建数据点,需要进行一些计算(不是非常昂贵的计算) 我面临的问题是决定将计算放在哪里(客户端还是服务器端?还是一半一半一半?) 我应该寻找哪些因素来帮

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

基本上,客户端可以查看“股票”图表(允许客户端选择不同的时段、设置等)。我基本上已经编写了整个应用程序,但我不知道如何将其组合起来

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

我面临的问题是决定将计算放在哪里(客户端还是服务器端?还是一半一半一半?)

我应该寻找哪些因素来帮助我决定应该在哪里进行计算?我该如何进行优化(缓存等)


显然,这是一个非常广泛的主题,因此我不希望立即得到答案,但任何帮助/指向正确方向/资源都将不胜感激。

这类应用的一些提示。
将尽可能多的逻辑放在客户端上。
使客户端负责会话数据,使所有服务器代码无状态。

尽量减少往返服务器的流量(较大的请求比多个较小的请求更有效),以便在可能的情况下整合请求。

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

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


还有一件事,如果这个项目不太可能是一个长期问题,那么在最容易和最快的地方实施计算,如果项目以后变得更重要,您可以重新考虑。

在实施客户端缓存时要非常小心。在保持性能、安全性和正确性的同时,缓存很难做到正确。请注意,您的DB服务器的缓存机制可能已经比您可能在不到2周的时间内实现的任何本地缓存机制要好得多

我敦促您尽可能多地在后端进行工作,并限制您的客户端以适合您的用户的方式呈现数据。虽然许多人可能会对这一建议犹豫不决,但这是基于过去建造许多此类系统的大量观察结果:

  • 如果您要过滤服务返回的一些数据,那么您就浪费了数千个时钟周期来传送从未离开服务器的数据
  • 如果要对数据进行排序,则DB可以在等待从其磁盘读取数据时为您进行排序(通常使用空闲的CPU标记)
  • 您的服务器很可能比您的客户机有更多的可用CPU和RAM,并且在等待磁盘读取扇区等时,有大量“空闲时间”用于排序、筛选、运行内联计算等
正如Roman所建议的:尽可能减少客户端和服务器之间的往返

但也许最重要的是:

  • 在开始设计系统之前,请说明您的性能目标
  • 设计你认为能实现这些目标的东西。尝试找出设计中的瓶颈,特别是在进行阻塞调用的区域。重新设计这些区域,尽可能使用异步模式
  • 构建您想要的解决方案
  • 在实际负载下测量您的实际性能
  • 如果你达到了预期的绩效目标,那么你就完成了
  • 如果没有,找出你花费太长时间的地方,调整系统那部分的设计。转到3
  • 不要试图一次就建立一个完美的系统——不管你怎么努力,都有可能因为各种原因而无法管理它,包括用户期望、服务器处理所需负载的能力、客户端处理返回数据的能力、网络承载流量的能力等等

    它们现在已经有点过时了,但我建议您通读上一篇文章,了解更多关于设计和构建面向服务和分布式系统的想法