分布式服务器如何保证session的一致性

Session

  对于HTTP短连接请求,由于其无状态记忆的特点,此次连接无法得到上次连接的状态。因此,引入了Session的概念,服务器为每个用户创建一个Session,存储用户的相关信息,以便多次请求能够定位到同一个上下文。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

  最常见的,会把用户的登录信息、用户信息存储在session中,以保持登录状态。

 

Session一致性

  只要用户不重启浏览器,每次HTTP短连接请求,服务端都能定位到Session,保持会话。

 

Session一致性解决方案

  对于分布式服务器,当高并发量的请求到达服务端的时候通过负载均衡的方式分发到集群中的某个服务器,这样就有可能导致同一个用户的多次请求被分发到集群的不同服务器上,就会出现取不到session数据的情况。所以,我们需要解决Session一致性的问题。

  Session一致性解决方案:Session同步法;客户端存储法;反向代理哈希一致性;后端统一存储。

Session同步法:

  服务器同步Session,这样每个服务器都包含全部的Session

优点:应用程序不需要修改代码

缺点:

  • session的同步需要数据传输,占内网带宽,有时延

  • 所有web-server都包含所有session数据,数据量受内存限制

 

客户端存储法:

  将Session存储到浏览器Cookie中,每个端只要存储一个用户的数据

优点:服务端不需要存储

缺点:

  • 每次HTTP请求都携带Session,占外网带宽

  • 数据存储在端上,并在网络传输,存在泄漏、篡改、窃取等安全隐患

  • session存储的数据大小受cookie限制

 

反向代理哈希一致性:

  使用反向代理层,让同一个用户的请求保证落在一台服务器上

1. 四层代理哈希

  反向代理层使用用户ip来做哈希,以保证同一个ip的请求落在同一台服务器上

2. 七层代理哈希

  反向代理使用HTTP协议中的某些业务属性来做哈希(city_id,user_id等),能够更加灵活的实施哈希策略,以保证同一个浏览器用户的请求落在同一台服务器上

优点:

  • 只需要改nginx配置,不需要修改应用代码

  • 负载均衡,只要哈希属性是均匀的,多台服务器的负载是均衡的

缺点:

  • 如果服务器重启,一部分Session会丢失,产生业务影响,例如部分用户重新登录

 

后端统一存储:

  将Session存储在服务器后端的存储层,数据库或者缓存

优点:

  • 没有安全隐患

  • 可以水平扩展,数据库/缓存水平切分即可

  • web-server重启或者扩容都不会有Session丢失

缺点:增加了一次网络调用,并且需要修改应用代码

 

作者:明志健致远
♠ 出处:http://www.cnblogs.com/study-everyday/
♦ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
♣ 本博客大多为学习笔记或读书笔记,本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。

posted @ 2021-03-13 22:16  封狼居胥!  阅读(489)  评论(0编辑  收藏  举报