关于并发你真的了解吗?(二)
本文仅代表带个人观点及理解,本人只是一个编程小菜鸟,如果有不对的地方。请大佬轻喷!
前言:对于一些公司来说可能会遇到一些并发处理的问题,本文有可能会对您有所帮助。
对于一台服务器的公司来说如果您有提升并发处理的需求但是又不想增加服务器数量的话,以下方法有可能对您有所帮助:
1.如果web服务器cpu使用率很低但是又需要更高效的处理并发连接请求,您可以尝试设置最大工作进程数。
IIS作为Windows平台下Asp.Net网站发布的默认WEB服务器,在性能上是提供了比较大的弹性和可伸缩性,通过应用程序池工作进程数的设置,可以支持从几十到上万并发数量的访问。
在主流的主机上,每个应用程序池的单一工作进程,能够大约承受30-50个左右的并发,如果超出此并发数量,可能会出现IIS无法响应、或响应时间明显变长的问题。通过合理设置应用程序池的最大工作进程数,可显著提高IIS应对高并发的能力,减少网站响应时间。(具体设置方式可详见上一篇文章《关于并发你真的了解吗?(一)》博客园地址:http://www.cnblogs.com/xinwuhen/p/7049093.html)
2.建议使用 InProc 的Session保存机制
3.合理的资源回收机制:大多数应用系统都存在工作时间使用量高、非工作时间使用量低的情况,针对这种现象,在系统非忙时应合理的释放操作系统资源,因此,应合理设置应用程序池的【限制超时】和【回收时间间隔】属性。
4.程序优化(详见《关于并发你真的了解吗?(三)》)
5.数据库操作优化(详见《关于并发你真的了解吗?(三)》)
多服务器,对于多服务器的公司来说。以下方式可能对您有所帮助:
1.对于多台服务器来说,首先也要满足单独服务器优化配置。上面有讲述,这里需要注意对于多服务器Session的保存机制可以使用其他的方式下文有重点介绍。
2.您可能会遇到,某一台或者多台服务器已经超过了并发处理量。而其他服务器却还有很富余的并发处理能力的情况。
此种情况您可能需要分流操作,我知道的有三种分流:
2.1,集群 - 将并发请求分配到不同的服务器上,可以是业务服务器,也可以是数据库服务器。集群技术:多台服务器应看作为一个服务集群而不是单一的个体服务器。群集技术是使单个服务器实现物理和程序上的连接,并对服务器之间的通讯进行协调,以使它们能够执行共同的任务。即便某一台服务器停止运行,一个由进程台调用的故障应急程序会自动将该服务器的工作负荷转移至另一台服务器,以保证提供持续不断的服务。除故障应急程序外,某些形似的群集也使用负载平衡功能,该功能可使计算负载在联网的计算机间得以分配。
2.2,分布式 - 分布式是把单次请求的多项业务逻辑分配到多个服务器上,这样可以同步处理很多逻辑,一般使用与特别复杂的业务请求。分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统。透明性是指每一个数据库分布节点对用户的应用来说都是透明的,看不出是本地还是远程。在分布式数据库系统中,用户感觉不到数据是分布的,即用户不须知道关系是否分割、有无副本、数据存于哪个站点以及事务在哪个站点上执行等。
2.3,CDN - 在域名解析层面的分流,例如将华南地区的用户请求分配到华南的服务器,华中地区的用户请求分配到华中的服务器。
3.负载均衡设备(网上很多文章,不过多介绍)
4.使用消息队列。队列的使用除去了接收和发送应用程序同时执行的要求。减少并发处理数量的占用
5.缓存机制:将需要频繁访问的资源存放在缓存中不仅可以降低数据库压力而且还可以提高访问速度进而提高用户体验。适程度而定必要时可以考虑缓存服务器的搭建。
6.数据库分库分离活跃数据 :可以自定义规则来判定哪些访问频繁的数据或者重要访问来访问单独库,即“重要数据特殊对待”。从而减轻主库压力。并且可以提高用户体验。
7.降低响应时间(详见《关于并发你真的了解吗?(三)》),总体分为降低程序执行时间,降低数据库操作时间。要知道即使是毫秒级的程序执行速度差异,在足够大的并发访问量下。差距也是异常惊人的。
8.Asp.Net的Session共享
Asp.Net提供了五种Session保存机制:
(1)Off 设置为不使用Session功能 性能 无
(2)InProc 置为将Session存储在进程内,就是ASP中的存储方式 性能 最好
(3)StateServer 设置为将Session存储在独立的状态服务中。 性能损失10-15% 一般用于服务器集群使用
(4)SQLServer 设置将Session存储在SQL Server中。性能损失10-20%
(5)Custom 自定制的存储方案 性能 由实现方式决定(一般自定义方式编写不难,但是好的性能方案很难)
在Asp.Net程序的web.config配置文件中对Session的保存方式进行设置。如果不显示指定Session的保存方式,默认使用InProc的方式保存,即Session由提供服务的工作进程保存。
为了提高IIS对高并发的支持,可以增加应用程序池的工作进程数,IIS会根据内置的调度算法,将用户的请求在多个工作进程间动态分配,如果搭建了服务器集群和负载均衡,则用户请求会在多台机器的多个工作进程间进行动态分配。在上述情况下,如果Session的保存方式依然为InProc,则用户请求在多个工作进程间切换时可能出现Session丢失的情况,导致请求失败或出错。
为解决上述为,需要将Session的保存方式设置为共享即StateServer”、“SQLServer”或“Custom”方式。这三种方法中,“SQLServer”方式需要安装独立的SQLServer数据库,“Custom”方式需要自行实现相应的Session存储与检索过程,部署起来相对复杂,相对上述两种方式,“StateServer”方式在功能性和可实施性上最好,因此重点介绍此种Session共享机制。
设置步骤
1、 确定StateServer服务器。如果只有一台WEB服务器,可指定当前服务器为StateServer服务器。如果存在多台服务器集群,可指定集群中的一台符合较轻的服务器作为StateServer服务器。
2、 修改注册表,允许远程访问StateServer服务。
端口默认为42424,可根据需要进行修改,下文均以42424为例。
3、 打开【管理工具】-【服务】,找到“Asp.Net State Service”,点击右键,选择【属性】
在弹出的【属性】窗口中,将【启动方式】改为“自动”,然后点击【启动】按纽启动服务
4、 打开待修改网站主目录下的web.config配置文件,搜索找到“<sessionstate>”配置节点,如果不存在配置节点,则在“<system.web>”节点下新建“<sessionstate>”配置节点,并将节点属性修改为:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" />
其中“tcpip=*”后的主机IP地址和端口可根据实际情况修改。修改完后保存配置文件即可。
注意事项
1、 Session中保存的自定义对象必须显示标记为可序列化“[serializable]”。如果未显示标记为可序列化,则在访问页面时会报错。
2、 StateServer服务器必须为Windows Server操作系统,如Windows Server 2003或Windows Server 2008。