分布式session一致性问题

1.分布式session一致性 :指服务器集群情况下session共享的问题。

2.session的作用:保存服务器(tomcat)与客户端(浏览器)整个通讯的会话基本信息。

3.session应用场景:记录用户信息。登录场景(账号密码登陆成功之后,获取到userid,存放在session中,下次登录的时候直接从session中获取用户信息)、防止表单重复提交。

 session可以理解为本地jvm缓存,session存放在服务器端,返回sessionid给客户端,客户端下一次请求根据sessionid去服务器端获取用户信息。

session原理:

  session存放在哪里? 服务器端

  浏览器关闭了,session会失效吗?  不会失效。

第一次请求:客户端向服务器端发送一个请求,服务器接收到客户端的请求,会创建一个session,使用响应头返回给客户端一个sessionid,浏览器获取到sessionid之后存放在本地。

第二次请求:客户端读取本地的sessionid存放在请求头中,服务器端从请求头中获取到对应的sessionid,使用sessionid在服务器本地查询对应的信息。

//默认创建一个session,默认值为true。
//设置为true情况下,客户端使用对应的sessionid查询不到的对应的session,则会创建一个新的session。如果查到则复用。
//设置为false情况下,客户端使用对应的sessionid查询不到对应的session的时候,不会创建session。
HttpSession session = request.getSession();
System.out.println("存入session信息,sessionid:" + session.getId() + ",value:" + value + ",serverPort:" + serverPort);
session.setAttribute("name", value);
session 分为sessionid和sessionvalue
session 跟 token非常相似。session、token本身是临时的,sessionid和token都是保证临时且唯一的。

服务器集群之后会出现哪些问题

 1.分布式session问题(因为session存放在服务器端,sesionid找不到对应的sesion)
2.分布式任务调度平台(服务器集群之后如何保证定时job唯一性问题、幂等性)
2.1 xxl-job 框架
3.分布式锁解决方案
3.1 基于zookeeper 使用临时节点 + 事件通知
3.2 基于redis 使用setnx方式 不推荐,容易产生死锁现象,代码复杂
3.3 基于SpringCloud 的 redission。redis中提供了很多关于分布式解决方案的 分布式锁
4.分布式日志收集问题(如果有服务有20台做集群,查询日志的话非常麻烦)
4.1 elk
4.2 kafka
5.分布式事务问题(与集群没有关系)
5.1 lck 框架
6.分布式配置中心(与集群没有关系)
6.1 SpringCloud中的config
6.2 携程apollo 框架

分布式Session解决方案

方案1.直接使用cookie替代session(不靠谱)。不推荐

方案2.使用Nginx反向代理 使用IP绑定算法。不推荐,因为同一个ip只能访问指定的同一个机器访问(没有负载均衡,相当于没有做集群处理)

方案3.使用数据库。不推荐,效率低。

方案4.tomcat 内置支持对session 的同步。不推荐,同步会产生延迟。

方案5.使用Spring-session框架,相当于把我们的session值缓存到redis中。推荐使用

方案6.使用Token代替session。推荐使用

面试题:你们项目在发布的时候,如何保证Session不失效的问题?

使用spring-session框架,缓存session的值到redis中(一级缓存和二级缓存)。

 
原文地址:https://www.cnblogs.com/ming-blogs/p/10800897.html