首页 > 运营 > 帮助中心 > 正文

Session的一致性问题解决办法

2020-07-28 15:59:35
字体:
来源:转载
供稿:网友
  一、什么是Session?
 
 1、What:Session在网络应用上表示“会话控制”,用于存储特定用户会话所需的属性及配置信息;Session又表示一个特定的时间间隔,指从登录进入系统到注销退出系统之间所经过的时间。
 
 2、Why:http是无状态的协议,在动态web应用中,往往需要知道前面的操作和后面的操作是不是一个用户。也就是业务是需要有关联性的。
 
 3、How:结合Session和浏览器Cookie,将服务器端Session保存到浏览器cookie中来保持http会话状态。
 
  二、什么是Session一致性问题
 
 1、当一个带有会话标识的HTTP请求到了Web服务器后,需要在HTTP请求的处理过程中找到对应的会话数据(Session),而问题在于,会话数据是需要保存在单机上的。如上图,当我第一次访问服务器的时候,请求落在左边的服务器上,那么就会在左边的服务器上创建Session,如果不做处理,那么我们,每次访问服务器就不能保证每次请求都落在左边的服务上,这就是Session问题。
 
  三、如何解决Session问题:
 
 1、第一种方案:基于nginx的ip_hash策略来做负载均衡
 
 a、原理:根据ip做hash计算,同一个ip的请求始终定位到同一台tomcat上。
 
 b、如在nginx.conf配置如下:
 
  upstreamsessionTest{
 
  ip_hash;
 
  server192.168.11.1308080;
 
  server192.168.11.1308081;
 
  }
 
 c、此种方案的好处:配置简单,没有侵入性;
 
 d、坏处:单点故障,服务器挂了,导致Session丢失。
 
 2、第二种方案:服务器Session的复制
 
 a、原理:Tomcat服务器创建Session后,会通过组播方式把Session发送到组播地址中的其他服务器上。
 
 b、这种方案一般的容器都支持,但是这种方案本身有一些问题,在一定场合下问题很严重。
 
 c、同步Session数据会造成网络带宽的开销,只要Session数据有变化,就需要将数据同步到其他机器上,机器越多,同步带来的网络带宽开销就越大;每台机器都保存所有机器的Session,会占用内存。所以这个方案不适合集群的场景下,如果只有几台机器,用这个方案是可以的。
 
 3、第三种方案:Session的集中管理
 
 a、原理:Session不由Tomcat管理,而是统一放到一个地方管理,读取和写入Session都依赖第三方软件,如redis,mysql,mongodb等。
 
 b、一般redis使用的比较多,将Session保存到redis中,每次需要Session的时候就可以到redis缓存中取Session数据。
 
 c、这种方案可以说是终极解决方案,一般分布式的环境下用的比较多。不过也有缺点,对代码有侵入性,需要改配置,维护第三方库。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表