高效分布式 Session 管理

  • 王翔

2007 年 10 月 31 日

话题:.NET架构DevOps语言 & 开发

作为 ASP.NET 应用的一个重要组成部分,Session 是绝大部分项目需要面临的问题。但当 Session 中对象超过某个容量时(一般在 100K 左右),整个 ASP.NET 应用性能会急剧下降,这缘于 ASP.NET 在 Session 处理上采用一种只要有“风吹草动”就需要读 / 写整个 Session 中的内容的策略,而项目中往往又需要经常对 Session 中的信息进行维护,例如:购物车。除此而外,一些用户不必要的 Web 点击引发的 Session 内容加载和更新也会对应用性能带来明显负面影响;伴随着 SOA 和企业应用的整合的浪潮,很多时候 Web 应用间需要共享 Session,也就是分布式的 Session 访问。

考虑到 ASP.NET 内置 Session 管理的局限性,针对上面两个情况,可以通过采用第三方产品作为专用的进程外 Session 管理宿主(例如:产品化的 Scaleout StateServer),它主要适于下列情况:

  • Web Server 的不同 Web 应用间,Web Farm 中的不同 Web Server 间需要共享 Session 信息,一方面有可能因为 Singleton 访问的要求,另一方面考虑到高可用集群的需要,即便某个 Web Server 宕掉之前从它发起的 Session 变更结果同样可以被其他 Web Server 获得;
  • 适于频繁大颗粒度 Session 数据小比例修改的 ASP.NET 应用;

图:一般进程外 Session 服务的结构

不仅如此,由于 Session Server 为进程外对象的关系,因此可以把来自不同数据源的相对容量较大的参数表的缓冲交由这个独立的 Session Server 调用

除了商用产品外,开源的 NCache 也提供动态集群扩展能力,包括复制、分区、分区复制和客户端 Cache 的支持。

.NET架构DevOps语言 & 开发