1. 基于 NFS 的 Session 共享
NFS 是 Net FileSystem 的简称,最早由 Sun 公司为解决 Unix 网络主机间的共享而研发。
这个方案实现最为简单,无需做过多的二次开发,仅需将共享目录服务器 mount 到各频道服务器的本地 session 目录即可,缺点是 NFS 依托于复杂的安全机制和文件系统,因此并发效率不高,尤其对于 Session 这类高并发读写的肖文杰,会由于共享目录服务器的 io-wait 过高,最终拖累前端 WEB 应用程序的执行效率。
2.基于数据库的 Session 共享
首选当前是大名鼎鼎的 MySQL 数据库,并且建议使用内存表 Heap,提高 Session 操作的读写效率。
这个方案的实用性比较强,相信大家普遍在使用,它的缺点在于 Session 的并发读写能力取决于 MySQL 数据库的性能,同事需要自己实现 Session 淘汰逻辑,以便定时从数据表中更新、删除 Session 记录,当并发过高时容易出现表锁,虽然我们可以选择行级锁的表引擎,但不得不否认使用数据库存储 Session 还是有些杀鸡用牛刀的架势。
3.基于 Cookie 的 Session 共享
这个方案我们可能比较陌生,但它在大型网站中还是比较普遍被使用。原理是将全站用户的 Session 信息加密、序列化后以 Cookie 的方式,统一种植在根域名下(如:host.com),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有 Cookie 内容的特性,从而实现用户的 Cookie 化 Session 在多服务间的共享访问。
这个方案的优点是无需额外的服务器资源;缺点是由于受 HTTP 协议头信息长度的限制,仅能够存储小部分的用户信息,用时 Cookie 化的 Session 内容需要进行安全加密(如:采用 DES 、RSA 等进行明文加密;再由 MD5 、SHA-1 等进行防伪认证),另外它也会占用一定的带宽资源,因为浏览器会在请求当前域名下的任何资源时将本地 Cookie 附加在 HTTP 头中传递到服务器。
4. 基于缓存(Memcache 、Redis 等) 的 Session 共享
Memcache 由于是一款基于 Libevent 多路异步 I/O
技术的内存共享系统,简单的 Key + Value
数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势。
另外值得一提的是 Memcache 的内存 hash
表所特有的 Expires
数据过期淘汰机制,正好和 Session 的过期机制不谋而合,降低了过期 Session 数据删除的代码复杂度,对比“基于数据库的存储方案”,仅这块逻辑就给数据表产生巨大的查询压力。
5. Session 共享
略…
6. 使用 Filter 方式实现用 Memcache 存储 Session
略…
7. 使用类似BIG-IP的负载设备来实现资源共享
略…