[英]Addressing scalability ,performance in a .net web application
我正在开发一个 .net 门户网站,该门户网站将拥有大量并发用户。 因此可扩展性、性能需要在设计和架构中加以解决。 我们计划在应用程序中使用负载平衡。
牢记这一点,在 IIS web 服务器(托管 aspx、aspx.cs 文件)和应用程序服务器(托管 Z2D50972FECD376129545507F1062089 业务层)和访问数据层之间进行通信的最佳方式是什么? 应该是 .net 远程处理还是 soap web 服务?还是有其他方法?
谢谢。
还有另一种方法吗? 是的 - 不要分发你的对象。 最具可扩展性的方法是不要将您的对象彼此分开。 问问自己,为什么要将一种风格的代码部署到“应用服务器”而另一种风格的代码部署到“Web 服务器”? 这两个层之间进行的通信,如果它们是分布式的,将比本地调用昂贵得多(等等)。
有了今天的 64 位服务器、所有 memory 和热 CPU,以及 ASP.NET 卓越的 memory 管理,为什么不将业务逻辑和 DAL 放在与 ASPX 文件相同的物理机器上呢? 为什么不?
如果您需要扩展,请添加更多服务器。 简单的。
当然,分发是有充分理由的。 最常见的充分理由与所有权领域有关 - 沿着几个轴:安全管理,甚至预算和控制。 换句话说,对于后一种情况,如果团队负责运行业务逻辑,而一个单独的团队负责构建和运行 web 层,那么分配这两个东西以实现管理的独立性可能是有意义的。 大多数分发计算机代码的充分理由都源于使用或开发代码的人类组织的结构。
web 页面不应该在同一个 CPU 上运行,共享同一个 CLR VM 和 memory 堆作为数据库访问层,没有很好的技术原因。
无论您如何处理分发,使用定义层之间连接的不太正式的接口来构建您的系统都是不明智的。 如果您保留正式的接口,那么衡量分布式方法与协同定位方法的性能和效率应该没有问题。
你真的需要一个应用服务器吗? 你到底在说多大? 例如 Stackoverflow.com 每天有大约 50k 的唯一身份,并且没有应用服务器,所以我假设你说的比这大得多? 大多数性能瓶颈都归结为数据库问题,因此我将专注于这一点。
我建议您查看 Patterns and Practices groups 性能指南,更具体地说是第 6 章 - 改进 ASP.NET 指南的性能。 我同意 Cheeso 的观点,如果可以的话,您应该认真考虑不要在物理上拆分您的应用程序层和 UI 层。 P&P 指南有以下注释:
避免不必要的进程跳跃
尽管进程跃点不像机器跃点那么昂贵,但您应该尽可能避免使用进程跃点。 进程跃点会导致额外的开销,因为它们需要进程间通信 (IPC) 和封送处理。 例如,如果您的解决方案使用企业服务,请尽可能使用库应用程序,除非您需要将企业服务应用程序放在远程中间层。
了解远程中间层的性能影响
如果可能,请避免进程间和计算机间通信的开销。 除非您的业务需求要求使用远程中间层,否则请将您的演示、业务和数据访问逻辑保留在 Web 服务器上。 将您的业务和数据访问程序集部署到应用程序的 Bin 目录。 但是,出于以下任何原因,您可能需要远程中间层:
- 您希望在面向 Internet 的 Web 应用程序和其他内部企业应用程序之间共享您的业务逻辑。
- 您的横向扩展和容错要求决定了使用中间层集群或负载平衡服务器。
- 您的公司安全策略要求您不能将业务逻辑放在 Web 服务器上。
如果您无论如何都必须拆分应用程序逻辑,则可以使用 WCF 作为传输机制。 我不确定它在性能方面如何与远程处理相提并论。 但是,我似乎记得这是微软正在推动的指导方针。
Clemens Vasters(Microsoft .NET 服务总线的技术主管)在 MSDN 论坛上的这个答案中讨论了 WCF 与远程处理。
学习异步编写。
例如,探索 CCR 运行时。
每个因等待 IO 响应而被阻塞的线程对您的系统可用的线程更少。
关闭“理想化日志记录”保留通过管理控制台重新打开它的能力。 但伐木往往是一个隐藏的瓶颈。
缓存缓存缓存!
如果第一次获取数据的成本很高,那么第二次就不要为它买单了!
避免 ASP.net 的 Session State - 这会严重膨胀并导致页面响应速度大幅下降。
修改 http 标头以指定短浏览器缓存(5sec - 20sec)(取决于内容的性质)
在您使用 GZIP 时使用它!
并使用大量 RAM
Omar Al Zabir的这些文章中有一些良好的性能和可扩展性要点。
10 ASP.NET 性能和可扩展性秘密
和
99.99% 可用 ASP.NET 和 SQL 服务器 SaaS 生产架构
(还可以查看他的书Building a Web 2.0 Portal with ASP.NET 3.5 )
这是我的提示
1) 将所有 static 文件 - 图像、css、js 移动到负载均衡器,如 nginx。 这将大大减少 IIS 服务器的负载,并且它将有足够的空闲资源来服务于主请求。
2)考虑缓存和完全避免数据库访问。
3)尽量执行REST原则。
4) 将 session state 保持在最低限度 - 如果可能的话完全避免它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.