• 分布式下Session一致性问题


    一、Session一致性问题

    1.1 什么是Session

    用户使用网站的服务,基本上需要浏览器和web服务器进行多次交互,web服务器如何知道哪些请求是来自哪个会话的?

    具体方式为:在会话开始时,分配一个唯一的会话标识(sessionId),通过cookie把这个标识告诉浏览器,以后每次请求的时候,浏览器都会带上这个会话标识来告诉web服务器请求是属于哪个会话的。如果遇到禁用cookie的情况,一般的做法就是把这个会话标识放到url的参数中。

    1.2 什么是Session一致性问题

    因为会话信息保存在单机上,当我们的应用服务器从一台变成两台后,我们就会遇到session的问题了!

    如下图所示,当我们第一次访问网站时请求落到了左边的服务器,那么我的session就创建在左边的服务器上了,如果我们不做处理,就不能保证接下来的请求每次都落在同一边的服务器上了,这就是session问题。

    二、解决方案

    start nginx
    
    nginx -s stop
    nginx -s reload
    

    以下方案都是解决session问题的方案,对于大型网站来说,session sticky和session集中管理是比较好的方案。

    2.1 session sticky

    session sticky

    http://blog.csdn.net/tomcat_baby/article/details/52787679

    http://blog.csdn.net/yangbutao/article/details/12971037

    在web服务器变成多台后,如果我们可以保证同一个会话请求都能在同一个web服务器上处理,那么对于这个会话个体来说,和单机的情况是一样的。这就需要负载均衡器能够根据每次请求的会话标识来进行请求转发。

    有何问题:

    ① 如果有一台web服务器宕机或重启,那么这台机器上的会话数据会丢失

    ② 负载均衡器变成了一个有状态的结点,要保存会话到具体web服务器的映射,要消耗一定的内存。

    实现:

    基于nginx的ip_hash策略来做负载均衡,根据ip做hash计算,同一个ip的请求始终会定位到同一台tomcat,这样做的好处是对应用无侵入,可以水平扩展

    2.2 session replication

    web服务器之间增加了会话数据的同步,通过同步就保证了不同web服务器之间的session数据一致,一般的应用容器都支持这种方式。

    问题:

    ① 只要session数据有变化,就需要将数据同步到其他机器上,会带来一定的网络带宽开销

    ② 每台web服务器都要保存所有的session数据,如果整个集群session数很多的话,对内存资源消耗较大。

    该方案不适合集群机器较多的场景。

    实现:

    服务器Session复制,Tomcat服务器创建Session后,会通过组播方式把session发送到组播

    2.3 session数据集中存储

    把session数据集中存储起来,然后不同的web服务器从相同的地方来获取session,存储session数据的方式可以为数据库,也可以使用其他分布式存储系统。

    问题:

    ① 获取session存在延时和不稳定性,不过我们的通信基本在内网,问题不大。

    ② 如果存储session的机器或集群发生问题,就会影响到应用。

    当集群规模较大时,session数较多时,该方案可以考虑。

    实现:Session不由tomcat管理,而是统一放到一个地方集中式管理,读取和写入Session都依赖第三方软件。例如redis,mongodb,mysql等

    该方案通过cookie来传递session数据,即把session数据存在cookie中

    问题:

    ① cookie有长度限制,这也就会限制session数据的长度

    ② 安全性,cookie的数据保存在客户端,这就存在安全性的问题,我们需要对写入cookie的session数据做加密处理

    ③ 带宽消耗, 客户端每次都要带着session过来,会消耗一定网络资源

    ④ 性能影响,每次http请求和响应都带有session数据,对web服务器来说,在同样的处理情况下,响应的结果输出越少,支持的并发请求就会越多。

    三、参考:

  • 相关阅读:
    HTML5 新标签
    lAMBDA表达式剖析
    whitespace 属性设置如何处理元素内的空白。
    "~/" asp.net 表示路径的方法
    ASP.NET Session详解
    关于CSS Selector的优先级
    关于汉字转拼音
    ChildActionOnly + ActionName的用法
    html中的caption是什么用
    window.location.href location.href parent.location.href
  • 原文地址:https://www.cnblogs.com/okokabcd/p/8481447.html
Copyright © 2020-2023  润新知