ASP.NET 已成为开发人员开发高流量 Web 应用程序的首要选择。 由于其可扩展性,ASP.NET 应用程序层可以无缝地处理每天数百万个请求的数千个并发用户。 这种高流量的 ASP.NET 应用程序部署在具有负载平衡器的负载平衡 Web 场中,将用户请求路由到多个 Web 服务器。
尽管 ASP.NET 应用程序层即使在高事务负载期间也表现出色,但该应用程序在其他领域面临一些关键的可伸缩性瓶颈。 这些瓶颈可能会减慢您的 ASP.NET 应用程序,甚至可能在您的业务活动达到顶峰时停止。
问题:四个性能瓶颈
这四个 ASP.NET 性能瓶颈描述如下:
数据库瓶颈
在负载平衡的 Web 场中,当事务负载增加时,您可以轻松添加更多 Web 服务器以实现线性扩展。 但是您不能以相同的方式将更多的数据库服务器添加到数据库层(SQL Server、Oracle 等)。 因此,数据库开始变慢,甚至可能在某一时刻崩溃。 此故障是您的应用程序面临的最关键的性能瓶颈。
ASP.NET 会话状态存储瓶颈
ASP.NET Session State 需要存储在某个地方,它的存储就像应用程序数据库一样成为瓶颈。 Microsoft 提供了三种存储选项,分别是 InProc、State Server 和 SQL Server。 这三个都有性能瓶颈。
InProc 强制您对每个 Web 服务器使用单个工作进程,这在多处理器或多核环境中不起作用,在这种环境中,首选具有多个工作进程。
而且,在负载均衡的 Web 场中,负载均衡器上需要一个粘性会话位,以便始终将用户请求发送到 Web 服务器,创建会话,即使该 Web 服务器超载而其他服务器处于空闲状态也是如此。
此外,SQL Server 不是 ASP.NET 会话状态的理想存储,因为它将它们存储为 BLOB,而 SQL Server 不能很好地使用它。
NCache 更多信息 ASP.NET 会话缓存 ASP.NET 会话缓存文档
ASP.NET View State 瓶颈
ASP.NET View State 是在 Web 服务器上构建的客户端状态管理功能,用于保存按钮和下拉菜单等控件的数据。 此数据仅在回发发生时发送到浏览器以返回。 和 ASP.NET View State 字符串的大小很容易达到 100 KB,乘以您每天收到的数百万个请求。
这不仅会减慢 ASP.NET 应用程序的响应时间,还会消耗大量额外带宽,从而显着增加运营成本。
不必要的页面执行
很多时候,ASP.NET 页面输出不会在多个请求之间发生变化,因为基础数据没有改变。 但是页面仍然执行以产生与上次相同的输出。 这种额外的页面执行会消耗大量系统资源,包括内存和 CPU,并且还会进行数据库调用。
解决方案:内存中分布式缓存
所有这些问题的最合适的解决方案是在您的 ASP.NET 和 ASP.Net Core 应用程序。 NCache 是一种流行的 .NET 开源分布式缓存。 让我们快速讨论如何解决我们的四个性能瓶颈 NCache.
NCache 更多信息 ASP.NET Core 会话存储策略 ASP.NET View State 缓存属性和概述
应用程序数据缓存
NCache 允许您缓存应用程序数据(只读参考数据和频繁更改的事务数据)以减少昂贵的数据库访问。 而不是去数据库, NCache 将 85-90% 的请求路由到缓存。 这排除了任何数据库争用的可能性。
不同于数据库, NCache 永远不会成为瓶颈,因为它是 分布式缓存 和 线性缩放. NCache 构建缓存服务器集群,并允许您在事务负载增加时向集群添加更多服务器。 以下是从数据库中获取数据并将其存储在缓存集群中的示例代码(如果缓存中尚未存在)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Customer Load(string customerId) { // Key format: Customer:PK:1000 string key = "Customers:CustomerID:" + customerId; Customer cust = (Customer) _cache[key]; if (cust == null) { // Item not in cache so load from db LoadCustomerFromDb(cust); // Add item to cache for future reference _cache.Insert(key, cust); } return cust; } |
会话状态存储配置
NCache 还允许您将 ASP.NET 会话存储在缓存中。 这是一个比其他存储选项更快的内存存储。 为了提供可靠性, NCache 在多个服务器上复制您的会话。 因此,如果服务器崩溃,会话数据不会丢失。ASP.NET 会话状态存储的好处是 NCache 是没有编程工作,您可以通过更改 web.config 无缝插入。 下面是一个例子。
1 2 3 4 5 6 7 8 9 |
<configuration> ... <sessionState cookieless="false" regenerateExpiredSessionId="true" mode="Custom" customProvider="NCacheSessionProvider" timeout="20"> <providers> <add name="NCacheSessionProvider" |
查看状态配置
NCache 让你缓存你的 ASP.NET View State 通过仅向浏览器发送标识符密钥在 Web 服务器端。 在回发中返回时, NCache 通过其 HTTP 处理程序拦截标识符键来获取视图结果。 然后将此视图状态发送到您的 ASP.NET 页面。
最终结果是速度快得多的 ASP.NET 应用程序,占用的带宽要小得多。 以下是如何使用的配置更改示例 NCache 用于缓存 ASP.NET View State:
ASP.NET 输出缓存
为了防止 ASP.NET 页面在其输出不变时不必要地执行,ASP.NET 提供了一个 输出缓存 单服务器和单工作进程配置的框架。 NCache,另一方面,将其扩展为多服务器和多工作进程配置。
通过 NCache,您还可以期望您的页面在数据库中的相关数据被修改时过期。 下面是一个例子。
结论
总之, NCache an 内存分布式缓存 具有线性可扩展性、简单的视图状态配置和与您的应用程序的无缝配置是所有这些性能瓶颈的最佳解决方案。 这些功能优化了 性能 .Net 应用程序并使其更快、更可靠和高度可用。