最近在整一套Web框架,因为公司全部都是.net工程师,所以选择了微软平台来构建一个中大型网站。
最近在做基础框架的时候,搞到Session这一块让我十分头疼,大家知道,大家知道微软为Session也是提供了比较全面的解决方案,但是每一种方案应用到大型应用中都是不太合适。
默认情况下一般Session都是Inproc模式,Session寄宿在Web(IIS)服务器的内存中,速度比较给力,但是全世界都知道此模式下Session会有丢失,IIS重启也会导致Session丢失,不可容忍。
在一种StateServer模式,Session寄宿在Asp.net的WindowsService下,由独立进程来维护,丢失基本不会出现,但是带来了效率上的损耗,另外此模式下被存储在会话状态中的对象必须能够被序列化。
还有一种可能是现在常用的Sqlserver模式,像很多php,Java程序一样,用数据库去维护Session,Asp.net自然是采用Sqlserver去维护,这样Session肯定是安全的,回收也由生成的存储过程自动实现了,但是带来的问题也是蛋疼到爆,访问量一大的话,数据库服务器必挂无疑。
仔细想了一下,以上三种模式单独出来都不太适合一定规模的网站,微软还提供了Custom模式,允许用户自定义Session,没有仔细研究,用的人也不多。
列举了上面集中微软提供的Session管理方案,Inproc,StateServer虽然效率不错,但是显然不足以应付大型Web应用。剩下来俩种方式应该都是可以。
目前的思路是有俩种:
1、使用Sqlserver达到Session持久化的目标,同时复制一份进入memcache,检测Session一概从memcache里读取,这在前面一篇文章中有所介绍:用memcached来保存session会话信息的思路。但是大量的Session更新,数据库的更新依然是十分蛋疼的问题。
2、还是研究下Custom模式,Session的自定义,这样的话应该是可以将Session提取出来存放到指定的位置,比如MongoDB就是很好的选择,利用NoSql存储Session,依然利用memcache读取,剩下的实现方式和1一样。
3、抛弃Session,像雅虎那样,完全无状态连接,采用Cookie,不过对于一些敏感性的操作还是感觉有一定风险。
综上,目前还是觉得2比较靠谱,这段时间还是集中精力研究下Custom模式,回头再写一篇关于此模式下Session存储的文章。
文章可能写的有些片面,对某些方面研究学习的还是不够深入,大神们赶紧来,求指点,求科普。
注:文章由CoderMan原创,转载请说明出处:CoderMan官方主页