tomcat session共享的尝试 (CAS, memcached, HA)

18 篇文章 0 订阅
9 篇文章 0 订阅

     不久之前, 为项目搭建了一个tomcat集群的环境, 具体如下: nginx+tomcat+memcached+memcached client forjava 主要是通过tomcat的filter将session共享到memcahced server中. 这个方案对于自己做的web application来说, 运行良好. 但其中的CAS服务器是单点的, 于是近两个星期打算将CAS也集群化. CAS的官网上有集群方案, 就是通过tomcat自身的session复制来进行. 一开始觉得这样配置并不完美, 另外, 我们自己的应用程序也不是通过这种方式来共享session的. 所以希望找到一个兼顾两方面需求的方案.

     在网上搜索了一下, 可以切入的点在于继承tomcat的catalina.jar中的standardmanager和standardsession, 改变其行为,当调用session的时候让数据存入到memcached server中去. 现成的开源项目有memcached-session-manager, 但它对memcached的使用,容错等方式不如memcached client forjava完善.

     于是自己动手,参照网上找到的memsession的例子(iteye上codeutil在2007年的例子, 汗颜, 别人07年就研究过了) 结合memcached client forjava进行改造. 结果令人沮丧, CAS是个特例, 它使用了spring的webflow. webflow非常依赖session, 而放到session中的东西不完全是值, 还有filter, container之类的对象. memcached client并不能把这些对象都序列化/反序列化. 在网上搜了一下这个问题,发现http://fallenlord.blogbus.com/logs/43591716.html这篇文章中提到了这个问题, "理论上CAS将票据存储分离到了数据库中应该已经是无状态的了,但很遗憾,CAS 3.x中使用了Spring Web Flow框架,这个框架要求使用一个flowExecutionKey来确定流程位置,它正是存储在Session中。" 这位作者应该是试过各种可能性得出的结论, 很重要的结论.

     另外试了一下memcached-session-manager, 也遇到类似的问题. 由此得出结论, 听jasig官网的, 还是用tomcat session复制的方法.

     整个过程,花了两个半星期,回想一下觉得动手过于草率. 没弄清CAS里到底什么需要写到session里, 只是隐约觉得memcached是灵丹妙药, 什么都能存. 并未想到瓶颈原来在客户端的序列化/反序列化. 草率之二, 因为牵涉到多个模块, 没有及时明确应该在稳定的模块基础上来做尝试. 也没有确认模块的稳定性, 导致过程中花了很多精力处理不相干的问题.

     结论, 要冷静, 头脑不要发热, 新的东西不一定最好, 别人推荐的是经验之谈, 应当考虑.

     后面还会再做些尝试, 因为tomcat session共享一样牵涉到序列化/反序列化的问题, 它能够走得通, 不只是如何处理的. 值得尝试.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值