zoukankan      html  css  js  c++  java
  • Session 在分布式系统中实现方式

    ##server独立Session
    例如以下图所看到的:
    server独立Session要求用户的每次请求都必须在同一台应用server上面操作,这就要求负载均衡server每次都能把用户的请求发送到同一个地址的server上面。
    第一个用户第一次訪问的1号server。那个在用户的整个会话中都必须由负载均衡server导流到1号server上面。

    其它server不会保存1号用户的Session信息。

    如今的负载均衡server一般都有这个功能(nginx)

    可是假设出现以下的情况

    这个时候1号server宕机的情况下,负载均衡server会把1号用户导流到2号或者3号server上面,可是用户在2和3号server上面没有安全的上下文环境。server会通知用户又一次登录。这样用户体验肯定会受到影响。并且非常可能用造成用户的数据丢失。

    每台server保留所有Session

    每台server保留所实用户的Session这就关系到应用server之间的Session同步问题。实时性要求比較高。

    这样的方式能够避免上面server独立Session所遇到的问题,例如以下图所看到的:

    长处

    这样的方式即使出现第一种情况那么2和3号server上面也保存的1号的Session信息,当出现故障负载均衡server把1号用户导流到2和3号server上面时。server也会发现有1号用户的安全上下文,能够继续訪问并且不须要又一次登录。

    缺点

    可是这样的方式也有缺点,那就是相应用server的Session同步实时性要求比較高,并且会带来额外的跨带开销。并且当Session之遥有变化时,就须要同步。假设Session里面的信息量比較大。那个会占用相当大的内存消耗。

    server共享Session

    server共享Session信息:

    长处

    每一个用户的Session信息都会被存储到应用之外的另外一台server(可能是数据库,也可能是KV存储服务),这样应用server就不用存储每一个用户的Session信息了,节约了非常大的内存开销。

    当不同应用server须要用到Session信息的时候就去找共享Sessionserver来获取信息。

    这样负载均衡server也就不用把用户固定的分配到一台server上面了,并且也不用server之间来复制Session信息,当Session信息发生改变时,应用server都去共享server改动信息就可以。

    缺点

    比較依赖于共享server,一旦共享server或者共享server集群出现故障。用户会收到非常大影响

    在Cookie中传递Session数据

    在Cookie中存放用户信息倒是能排除一个不稳定的因素,可是Cookie在安全方面还是存在隐患。并且Cookie也有长度的限制。

    在站点中用到最多的可能就是 应用独享Session 和 集中管理Session的方式。


    当中集中管理Session中能够用memcached 做为sessionserver。效率也非常高。当然其它的NoSQL数据库也能够。
    大家假设有什么好的建议能够一起学习。

  • 相关阅读:
    jQuery:自学笔记(1)——基础入门
    Android开发——Accessibility机制实现模拟点击(微信自动抢红包实现)
    Android开发——常用ADB命令的使用
    虚拟现实开发一些建议
    Android开发——Activity生命周期
    JVM——内存管理和垃圾回收
    2016年工作中遇到的问题41-50:Dubbo注册中心奇葩问题,wifi热点坑了
    2016年工作中遇到的问题41-50:Dubbo注册中心奇葩问题,wifi热点坑了
    Spring核心技术(十)——JSR-330标准注解
    Spring核心技术(九)——Spring管理的组件和Classpath扫描
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7399872.html
Copyright © 2011-2022 走看看