JAVA WEB开发中,跨服务器如何保证session的延续?

shenyi0106 2011-04-27 09:47:49
在WEB开发中,跨服务器如何控制session的延续?
...全文
250 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenyi0106 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 rainsilence 的回复:]
分布式存贮解决方案
[/Quote]
提供何种IO接口?
hepeng_8 2011-04-27
  • 打赏
  • 举报
回复
可以把session放在数据库吗 这样想在那用就在那用啊
rainsilence 2011-04-27
  • 打赏
  • 举报
回复
分布式存贮解决方案
shenyi0106 2011-04-27
  • 打赏
  • 举报
回复
非常感谢各位,尤其是ouwaner,还提供了好几种方案。

Memcache是一种内存数据库产品吗?
rainsilence 2011-04-27
  • 打赏
  • 举报
回复
session复制不是一种好的方法。当集群中的session流量总和超过一台计算机的承受极限的时候,将会造成大面积崩溃。。我建议你从sna架构的角度去考虑

用RequestWrapper+SessionWrapper+Filter把session给包裹掉,集成Memcache。
ouwaner 2011-04-27
  • 打赏
  • 举报
回复
跨服务器之间的Session共享方案需求变得迫切起来,最终催生了多种解决方案,下面列举4种较为可行的方案进行对比探讨:

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的Session共享

Memcache由于是一款基于Libevent多路异步I/O技术的内存共享系统,简单的Key + Value数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势,目前本人所经历的项目达到2000/秒 平均查询,并且服务器CPU消耗依然不到10%。

另外值得一提的是Memcache的内存hash表所特有的Expires数据过期淘汰机制,正好和Session的过期机制不谋而合,降低了过期Session数据删除的代码复杂度,对比“基于数据库的存储方案”,仅这块逻辑就给数据表产生巨大的查询压力
ouwaner 2011-04-27
  • 打赏
  • 举报
回复
session复制的方法,一种是基于db的,一种是基于memory的

session replication 的数据库持久化配置,也可以不用编程的:
  1、创建数据库
  create database was_sess;
  2、在管理控制台创建 datasource
  Resource -> JDBC -> JDBC provider -> data sources -> jndi: jdbc/sessions
  3、在管理控制台配置session replication
  Servers -> Application servers -> app name -> session management -> distributed environment -> in database
  设置数据源 JNDI 名称、用户名、密码、行大小即可(DB2专用)、是否使用多行(推荐,特别Session Object里面内容太多的时候)即可。
qingyuan18 2011-04-27
  • 打赏
  • 举报
回复
你说的应该是多个服务器集群的session复制吧?这个所有的Web服务器厂商都有这样的功能
shenyi0106 2011-04-27
  • 打赏
  • 举报
回复
听说weblogic可以配置session复制?
是不是有这么一说?
ouwaner 2011-04-27
  • 打赏
  • 举报
回复
因为SessionId是一致的,所以你可以在跨服务器间建立查询机制,通过SessionId,和key查询想要的数据
阿凡提提 2011-04-27
  • 打赏
  • 举报
回复
跨服务器。。。这个真有点难。。。不过来学习学习。
wangjiangbo2 2011-04-27
  • 打赏
  • 举报
回复
感觉不成,session应该只针对一个服务器
shenyi0106 2011-04-27
  • 打赏
  • 举报
回复
谢谢
结贴给分
rainsilence 2011-04-27
  • 打赏
  • 举报
回复
搜百度,很多的。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧