ASP.NET并发处理
讲到并发处理,我们一般会分为两个方面来说:a)服务器级别的并发控制; b)程序级别的并发控制。
服务器级别的并发控制:
Ø 调整服务器应用程序池中的最大连接数。
对于Web 服务器,dudu在优化博客园的服务器的时候写过以下的文章。
dudu 写过让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求http://www.cnblogs.com/dudu/archive/2009/11/10/1600062.html
1. 调整IIS 7应用程序池队列长度
由原来的默认1000改为65535。
IIS Manager > ApplicationPools > Advanced Settings
Queue Length : 65535
2. 调整IIS 7的appConcurrentRequestLimit设置
由原来的默认5000改为100000。
appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000
在%systemroot%/System32/inetsrv/config/applicationHost.config中可以查看到该设置。
3. 调整machine.config中的processModel>requestQueueLimit的设置
由原来的默认5000改为100000。
<configuration>
<system.web>
<processModel requestQueueLimit="100000"/>4. 修改注册表,调整IIS 7支持的同时TCPIP连接数
由原来的默认5000改为100000。
reg add HKLM/System/CurrentControlSet/Services/HTTP/Parameters /v MaxConnections /t REG_DWORD /d 1000000
完成上述4个设置,就可以支持10万个同时请求
Ø 对于DB服务器同样也可以调整最大连接数来做优化。
在调整优化好最大连接数之后,就只有软硬件负载均衡了。硬件负载均衡能够直接通过智能交换机实现,处理能力强,而且与系统无关,但是价格贵,配置困难,不能区分实习系统与应用的状态。所以硬件负载均衡适用于一大堆设备,大访问量,简单应用。软件负载均衡是基于系统与应用的,能过更好地根据系统与应用的状况来分配负载。性价比高。PCL负载均衡软件,Linux下的LVS软件。
程序级别的并发控制:
当两个用户同时访问一个页面,一个用户可能更新的事另一个用户已经删除的记录。或者,在一个用户加载页面跟他点击删除按钮之间的时间里,另一个用户修改了这条记录的内容。
当多个用户同时更新同一数据的时候,由于更新可能导致数据的不一致性,使得程序的业务数据发生错误,这种情况可以称之为并发。在ADO .NET中,并发的处理可以通过三种方式来控制:保守式并发控制、开发式并发控制以及最后更新生效方式。
— 保守式并发控制:数据从数据库取出之后,一直处于锁定的状态,其他用户不能获取该数据,直至数据更新完毕之后,用户才能取出该数据进行操作。此种控制方式对于性能和资源占用得很多,由于只能同时有一个用户对数据享用操作权,所以可能会在正常业务中,影响其他用户的处理进程。但此控制方式可以完全保证数据的完整性。该方式可以通过.NET提供的事务机制来实现,前提是数据源需要支持事务。
— 开发式并发控制:数据在更新之前都是可以被其他用户使用的,只有在更新的时候,才锁定记录。但更新的时候,会比对与查询之初的数据是否吻合,如果不一致,则不运行修改。此种控制方式也可以完全保证数据的完整性,其优点是不会占用其他用户访问该数据的权限,其缺点是由于其他用户可能已经更新了这些数据,导致本次更新可能不会完成。对于此种控制方式,多以开发人员通过程序本身的业务逻辑来实现。
— 最后更新生效方式:此种方式同上,只有在数据更新的时候,其他用户才不可使用,但更新的时候不检查是否与开始数据一致,而直接对其更新。此种方式对于更新的并发性有很大的支持,但缺点是可能引发前后数据的不一致。此种方式适合可以满足此需求的业务场景使用。
注意:数据库的并发处理并不是一成不变的,不同的业务场景对数据库的并发要求是不一样的,可以根据具体情况具体分析