如果你是一名架构师,这份指南提供以下的解决方案以帮忙你设计满足你性能目标的DotNet应用程序.
1.如何平衡性能和服务质量要求
不应该认为性能是一个孤立的因素,系统在考虑诸如扩展性,安全或可维护性的时候都可能会牺牲应用程序的性能,因此你必须平衡好两者间的关系.
2.如何识别和评估应用程序的性能问题
在你投入具体的时间和资源进行实现之前,我们应尽可能早的在设计过程中使用性能模型,以帮助评价你的设计决策是否满足了性能目标.通过性能模型识别你的性能目标,系统运行负荷和你的预算.预算是一个重要的约束,包括了最大的可运行时间和相关硬件的CPU,内存和IO吞吐量等.
3.如何执行架构和设计审查
设计的审查和你的目标部署环境,任何可能暴露的约束以及你的性能目标相关.应该使用性能和可扩展性框架中提供的分类作为指导来应用程序分割为不同的部分,然后对仔细分析每一部分使用的实现方法和步骤.
4.如何选择部署模式
当你在设计你的应用程序架构的时候,你必须连同相关的基础设施一起考虑部署的策略和过程.如果目标环境有特殊和严格要求,则在设计过程中必须得到反映.类似于安全和服务等服务质量属性也必须在设计过程中得到考虑.有时候为了协议和网络拓扑等的限制,你还必须对你设计方案进行折衷以满足要求.
一个良好的包含表现层,逻辑层和数据访问层的分层设计通常使你的应用程序扩展和可维护性变得更加容易.分层设计还在应用程序中创建了可预测点,在这些点上进行远程调用更加有意义.为了避免远程调用和额外的网络延迟,我们应尽可能的采用非分布式的架构.如对于BS的应用,所有的层都可以同时部署在同一台Web服务器上.
如果你确实需要分布式架构,则在设计相关接口的时候应该仔细考虑远程通讯的含义.比如,由于某种安全策略阻止你在Web服务器上运行业务逻辑,或者你的业务逻辑要被其它的应用所共享,在这些场景下我们都要尽量减少网络数据的来回传输.
5.如何为了需要达到的性能和可扩展性而设计
使用尝试和测试的设计原则.应该将注意力专注在核心的信息访问和错误经常发生的地方.性能框架所提及的类别描述可以帮助我们组织和对这些性能问题进行优先级排序.常见的类别包括数据结构,算法,通讯,一致性,资源管理,内聚和耦合,缓存和状态的管理.
6.如何在层间传递数据
当你选择实现方法的时候建议的考虑优先级为性能,可维护性和开发难易度.自定义类允许你实现高效的数据传递和序列化.如果你能够避免实现你自己的序列化可以使用结构.在灵活性和互操作性上面xml是一个很好的选择,但使用xml会导致在网络上传递大量的数据和schema信息.使用DataReader可以最快的访问到数据,但是却不适合在分布式系统中使用,因为DataReader需要一个保持打开的连接.使用DataSet可以获得最大的灵活性,同时还可以缓存数据,但是DataSet在数据传输和序列化上的开销是较大.
7.如何在Web Service,Remoting和Enterprise Service间做出正确选择
为实现跨应用程序边界,包括平台,已经相关的部署和信任边界.Web Service是推荐的远程通讯机制.微软产品组也推荐采用Web Service来实现这种分布式和SOA的应用.
>通过Web Service创建服务
>通过微软提供的WSE来增强Web Service服务
>但具备以下条件时候,可以采用Enterprise Service来作为服务边界.
你需要诸如对象池,分布式事务,角色安全和队列组件等特征
你的通讯是基于一台本地的服务器进行的,而且你担心Web Service和WSE的性能问题
>但具备以下条件时候,可以采用Remoting来作为服务边界.
你需要一个进程内,跨应用程序主域的通讯机制,Remoting在这上专门进行了优化
你需要使用自定义的通讯协议
处于对Web Service和WSE的性能问题的考虑
当使用这些服务的时候,还需要考虑以下性能因素:
>在使用Web Servie时候避免使用httpContext等低效对象和特征
>在使用Remoting的时候避免使用sinks和custom channels
>在使用EnEnterprise Service时候,避免使用COM+的API,而使用System.EnterpriseServices命名空间
8.如何设计远程接口
一个通用规则是要避免使用基于属性的接口.同时要避免设计那种需要客户端调用多个方法才能够实现一个业务功能的聊天式接口.你应该尽量避免客户端和服务器端来来回回的多次调用,尽量使用dto对象模型或方法参数来调用远程方法而不是直接访问远程对象的属性.同时还需要尽量的减少客户端和服务器端数据的传递.如果你已经使用了这些保留聊天式接口的对象,你可以使用data facade模式对代码进行重构.改模式将为服务提供一个统一的外观和粗粒度的封装.
远程传输对象模式是可以考虑的一种方案,同获取独立的数据项方法不同.该模式可以返回一次远程调用返回一个填充了值的数据对象,以后对数据对象的处理完全可以在本地的数据缓存中进行而不需要再进行远程调用,当我们需要提交修改的时候,远程服务提供一个简单的方法允许你将这些数据更新回服务器端.
9.如何在面向对象和面向服务间选择
当你设计一个分布式应用的时候,面向服务是推荐的方法.而面向对象是提供一个系统看上去应该怎样的单纯视角并有利于产生逻辑模型.一个但单纯的面向对象的方法不能够解决现实世界中诸如物理分布,信任边界,网络通讯等问题,也很难去解决类似于性能和安全性等非功能性需求问题.
通用的应用边界包括平台,部署,信任和演变机制.演变指应用的开发和升级是否是在一起的.当你围绕你的应用程序边界评估架构和设计决策时候,需要考虑:
>对象和远程过程访问在边界内
浙公网安备 33010602011771号