关于HTTPSession的问题

来源:互联网 发布:php rbac权限管理系统 编辑:程序博客网 时间:2024/05/20 06:50

面试题目:如何同步不同集群上的session?

1、使用组播 

    simple tcp cluster (tomcat5以上版本自带的基于tcp广播技术的集群,这种方法比较简单,只需修改server.xml配置文件即可)  。其本质就是session复制技术。session复制技术会带来如下问题:

   (1)技术复杂,必须在同一种中间件之间完成(如:tomcat-tomcat之间).

   (2)在节点持续增多的情况下,session复制带来的性能损失会快速增加.特别是当session中保存了较大的对象,而且对象变化较快时,性能下降更加显著.这种特性使得web应用的水平扩展受到了限制.

     实际在运行过程中会出现一系列的问题,如下: 

1、用户存入SESSION中的数据的问题

        使用tomcat集群进行SESSION复制,必须要保证你的session中存放的所有对象都是实现了java.io.Serializable接口 的,因为session复制就是序列化对象到其他WEB应用服务器上的,所以如果没有实现该接口,那么SESSION同步将会失败。另外一点,就是如果要同步的机器比较多的话,那么要注意保证SESSION中存放的数据比较小,不要什么都存放到SESSION中,因为复制SESSION也是需要开销的,数据越大开销也越大。

 

2、Tomcat执行SESSION复制的触发条件 

      我们在tomcat的server.xml文件中集群部分cluster标签中可以看到属性:useDirtyFlag, 如果这个设置为true(默认的),那么只有当使用setAttribute往session中设置数据的时候才会同步其他WEB服务器的 SESSION,如果为false,那么每一次请求的sesison都会被同步到其他服务器上。因此在操作SESSION的时候要特别注意,避免出现SESSION无法同步的问题。

       举个简单的例子,比如我们在单机应用情况下修改SESSION中用户的某一个数据,那么通常就是:       

User user = (User)request.getSession().getAttribute(“user”);     User.setName(“my name”);
这样我们就是直接存取出来,然后进行修改,虽然在单机情况下没有问题,但是在集群条件下,这样就导致了多台WEB服务器上的SESSION不同步的问 题,因为SESSION并没有改变,Tomcat无法监视session中某个数据的值是否发生了变化。因此,我们还需要执行如下操作以保证 SESSION的同步:
request.getSession().setAttribute(“user”, user);

      所以,我们在操作SESSION的时候要特别注意!另外的建议就是,我们应该尽可能的不要修改SESSION中的数据。

      因为Tomcat的SESSION复制通信是通过组播功能来实现不同服务器之间的交互的,所以需要在服务器上开通组播功能,windows默认情况下是开通组播服务的,而Linux系统下默认是没有开通的,我们需要通过如下命令来开通其组播功能:

    route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 

    如果需要服务器启动时即开通组播需在/etc/sysconfig/static-routes文件内加入eht0 net 224.0.0.0 netmask 240.0.0.0。具体组播概念请查阅CCNP相关内容。

    可以通过netstate -g 来查看组播状态,也可以在route -e 命令中看到         

    

    更详细的解释请查看:http://blog.csdn.net/renfufei/article/details/21549167

2、使用memcached共享session    

  memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

  memcached的速度非常快,使用libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。

 memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。

 

用过程注意几个问题和改进思路: 
  1、memcache的内存应该足够大,这样不会出现用户session从Cache中被清除的问题(可以关闭memcached的对象退出机制)。 
  2、如果session的读取比写入要多很多,可以在memcache前再加一个Oscache等本地缓存,减少对memcache的读操作,从而减小网络开销,提高性能。 
  3、如果用户非常多,可以使用memcached组,通过set方法中带hashCode,插入到某个memcached服务器


有时间可以去了解一下memcached的实现原理。


一个编程错误


项目出错,错误如下:

严重: IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.xxt.user.bean.FunctionBean  java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.xxt.user.bean.FunctionBean  

项目关闭后重启有时会报这个错:

解决办法:

 

public class FunctionBean implements Serializable//实现Seriablizable接口  

tomcat6 中关闭服务会自动把session持久化 存储在work目录下的 一个session.ser ,删除即可。


为什么需要持久化


       客户端访问了某个能开启会话功能的资源, web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要站用一定的内存空间。如果在某一时间段内访问站点的用户很多,web服务器内存中就会积累大量的HttpSession对象,消耗大量的服务器内存,即使用户已经离开或者关闭了浏览器,web服务器仍要保留与之对应的HttpSession对象,在他们超时之前,一直占用web服务器内存资源。

      web服务器通常将那些暂时不活动但未超时的HttpSession对象转移到文件系统或数据库中保存,服务器要使用他们时再将他们从文件系统或数据库中装载入内存,这种技术称为Session的持久化。

       将HttpSession对象保存到文件系统或数据库中,需要采用序列化的方式将HttpSession对象中的每个属性对象保存到文件系统或数据库中;将HttpSession对象从文件系统或数据库中装载如内存时,需要采用反序列化的方式,恢复HttpSession对象中的每个属性对象。所以存储在HttpSession对象中的每个属性对象必须实现Serializable接口


Session的持久化的作用

  

  1.提高服务器内存的利用率,保证那些暂停活动的客户端在会话超时之前继续原来的会话

  2.在多台web服务器协同对外提供服务的集群系统中,使用Session的持久化技术,某台服务器可以将其中发生改变的Session对象复制给其他服务器。保证了在某台服务器停止工作后可以由其他服务器来接替它与客户端的会话

  3.在一个web应用程序重启时,服务器也会持久化该应用程序中所有HttpSession对象,保证客户端的会话活动仍可以继续。

 Tomcat使用Session Manager 类来管理Session的持久化,他提供了两个SessionManager类

 org.apache.catalina.session.StandardManager org.apache.catalina.session.PersistentManager

StandardManager是tomcat默认使用的,在web应用程序关闭时,对内存中的所有HttpSession对象进行持久化,把他们保存到文件系统中。默认的存储文件为:

<tomcat 安装目录>/work/Catalina/<主机名>/<应用程序名>/sessions.ser

PersistentManager比StandardManager更为灵活,只要某个设备提供了实现org.apache.catalina.Store接口的驱动类,PersistentManager就可以将HttpSession对象保存到该设备


0 0
原创粉丝点击