手机版

ASP.NET通过分布式会话提高性能

时间:2021-10-11 来源:互联网 编辑:宝哥软件园 浏览:

如果使用SESSION,就必须解决分布式Session架构,构建高性能、可扩展的ASP.NET网站,因为单个服务器的Session处理能力很快就会出现性能瓶颈,而这种问题也叫Session同步。微软有自己的分布式Session解决方案,即SessionStateServer。我们可以参考:ASP.NET会话状态分区http://blog.maartenballiauw.be/post/2008/01/23/. ASPNET-Session-State-Partitioning.aspxASP.NET负载平衡和ASP.NET状态服务器http://blog.maartenballiauw.be/post/2007/11/Aspnet-负载平衡和-Aspnet-状态服务器-(aspnet _ state)。不过aspx,本文就是要改变这个方案,即使用Memcached达到分布式SESSION架构。Memcached作为一种分布式缓存服务器,已经广泛应用于网站建设中。Session的机制是针对用户的,我们也可以理解为是针对浏览器的。浏览器第一次访问ASP.NET网页时(网页没有关闭会话功能),会向客户端发送如下HTTP头:image

收到上面的HTTP头后,浏览器会将这个唯一的SESSIONID保存在自己的COOKIE中(只要COOKIE没有被禁用,本文就不讨论禁用COOKIE的情况,而是参考这篇非常NICE的博文http://www.cnblogs.com/fish-Li/archive/2011/07/31/2123191.html,)。当浏览器请求服务器再次访问时,它将在请求HTTP头中添加以下标识符。我们可以看到这个SESSIONID就是上面的sessionid: image

正是通过这样的机制,浏览器和服务器保证了用户的SESSION。如果客户端浏览器禁用Cookie,我们会发现每次刷新浏览器时,Set-Cookie都不一样,Cookie标识符永远不会出现在发送请求头中。这时,我们会发现Session是无效的(当然,为了防止这种情况,微软允许我们在sessionState中设置cookieless='true ',并使用URL传递sessionid)。二:Memcached提供者我使用的Memcached客户端是Memcached提供者。下载后,您会发现Memcached Providers已经为分布式Session提供了支持。如果您不知道如何使用Memcached提供程序,请参考本文Memcached技巧1:使用Memcached提供程序。Memcached Providers提供的例子是将SESSION直接存储在数据库中,我们可以通过配置将SESSION支持存储在分布式SESSION的内存中,也就是将下面的dbType从SQL修改为none。image

使用Memcached提供程序提供的分布式会话没有什么特别的,因为Memcached提供程序提供的SessionStateProvider类型在ASP.NET实现了抽象类SessionStateStoreProviderBase。我们可以看到配置文件中指定的SESSION的处理类是SESSIONStateProvider。因此,在收到客户端的请求后,ASP.NET会有意识地使用SessionStateProvider来处理所有会话。正是这个类在Memcached中读取和存储会话(如果设置了SQL,它将同步存储在SQLSERVER数据库中)。SESSION和传统的设定和阅读没有区别,阅读:SESSION[' sname 2 ']=' slumin XXI ';会话。超时=2;Get: response.write(会话[' sname 2 ']);第三,为什么要配置SQL?当只使用dbType作为none时,传统SESSION的缺点就会存在。当Memcached内存达到上限时会发生什么?Memcached使用LRU消除算法(已经很久没有使用了)。在这里,我们不需要研究这个算法在Memcached中是什么样的机制。我们只需要知道Memcached可能会杀死它,即使SESSION时间没有到。所以保险的方法是在Memcached下增加SQLSERVER的持久性。如果缓存命中,直接取缓存;如果缓存未命中,请再次前往数据库进行确认。当然,这会带来一些性能损失,但更安全。在Memcached Providers提供的下载文件中,提供了一些初始化SESSION的脚本。正确执行时,它将生成下表tblSessions和几个存储过程:image

TblSessions保存一个单独的会话,如下所示:

四:Memcached Providers的一个BUG当前Memcached Providers(1.2版本)中有一个关于Session State Provider(29520-trunk)的BUG(我已经提交给codeplex了,相信他们的下一个版本应该会被修正)。如果我们测试SESSION到期时间,我们发现它总是在一次刷新后20分钟(即默认)。这是因为在重载方法ReleaseItemExclusive(用于释放会话数据存储中项目的锁)中,到期时间不会添加到会话的重新存储中,如下所示:image

注释掉的是Memcached Providers提供的源代码,但正确的应该是我修改过的那个。使用修改后的DLL,一切都很完美。五、用数据库存储SESSION的可扩展性问题随着访问量的进一步增加(当然到了这个程度说明网站非常成功,大部分网站都不需要考虑这一步),即使我们用Memcached作为缓存,用单个SQLSERVER存储SESSION仍然会带来性能问题。在这种情况下,我们可以采用水平分区架构进行数据库设计,即按照某种算法(根据SESSIONID,或者用户名等)。),会话存储在不同的数据库中。此时,如果我们还在使用Memcached Providers,就必须进一步修改源代码,原来支持单个SQLSERVER,通过编程支持多个服务器。当然,如果不喜欢SQLSERVER,也可以对其进行修改,支持mysql、mongodb、任何自定义的KEY-VALUE框架等。这是另外一个故事,暂时不一一列举。

版权声明:ASP.NET通过分布式会话提高性能是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。