一、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等

2.4 cookie based

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

问题:

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

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

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

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

三、参考:

分布式下Session一致性问题的更多相关文章

  1. 分布式下Session一致性架构举例

    一.问题及方案 见这篇文章:分布式下Session一致性问题 二.分布式环境搭建: 系统环境 [root@centos7 ~]# cat /etc/redhat-release CentOS Linu ...

  2. nginx反向代理、负载均衡以及分布式下的session保持

    [前言]部署服务器用到了nginx,相比较于apache并发能力更强,优点也比其多得多.虽然我的项目可能用不到这么多性能,还是部署一个流行的服务器吧! 此篇博文主要学习nginx(ingine x)的 ...

  3. 分布式架构中一致性解决方案——Zookeeper集群搭建

    当我们的项目在不知不觉中做大了之后,各种问题就出来了,真jb头疼,比如性能,业务系统的并行计算的一致性协调问题,比如分布式架构的事务问题, 我们需要多台机器共同commit事务,经典的案例当然是银行转 ...

  4. 分布式session一致性问题

    1.分布式session一致性 :指服务器集群情况下session共享的问题. 2.session的作用:保存服务器(tomcat)与客户端(浏览器)整个通讯的会话基本信息. 3.session应用场 ...

  5. 【Distributed】分布式Session一致性问题

    一.概述 1.1 什么是Session 1.2 Session实现原理 1.3 Session常见问题 Session 保证在那里? 关闭浏览器Session会失效吗 服务器集群之后,Session产 ...

  6. 分布式下的session处理方式

    分布式下的session处理方式 现在的企业级别开发下,分布式的问题是随处可见.今天我们来看看分布式情况下session的处理. 目前的处理方式有以下几种: 1.session黏性.就是说,用户在访问 ...

  7. session一致性架构设计

    什么是session? 由于HTTP协议是无状态的协议,因此它不会去记住上一次浏览器访问服务器时的信息.同一个用户的两次操作,与两个不同用户的操作,对它来说是一样的. 这样虽然满足了互联网web应用的 ...

  8. 分布式系统session一致性的问题

    session的概念 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Sessio ...

  9. session一致性架构设计实践.

    一.缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文. Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建se ...

随机推荐

  1. (2)_引言Introduction【论文写作】

  2. Flutter入门教程(四)第一个flutter项目解析

    一.创建一个Flutter工程 1.1 命令行创建 首先我们找一个空目录用来专门存放flutter项目,然后在路径中直接输入cmd: 使用 flutter create <projectname ...

  3. Web最佳实践阅读总结(1)

    介绍 最近开始刷一些书和题,此系列是介绍在读Web最佳实践的一些收获和体会. web前端发展现状 存在问题: 代码组织混乱 代码格式的问题突出 页面布局随意 网站整体性能差,没有意识到应用诸如缓存,动 ...

  4. 下载jar包方法

    第一种通用下载jar包方法 apache官网下载jar包地址:http://ftp.cuhk.edu.hk/pub/packages/apache.org/   第二种通用下载jar包方法  mave ...

  5. 设计模式之:享元模式FlyweightPattern的实现

    享元模式的理解: 享元模式的定义:运用共享技术支持大量细粒度对象的复用: Flyweight Pattern Definition:Use sharing to support large numbe ...

  6. spring-xml实现aop-通知的种类

    如果本代码有疑问,请访问spring-aop快速入门或者spring-aop动态代理技术(底层分析) 1.导入aop的相关坐标 <dependency> <groupId>or ...

  7. Ubuntu 安装cmake

    Ubuntu 安装 cmake 官网 https://cmake.org 下载地址 https://cmake.org/download/ 参考文档 -<ubuntu下更新cmake版本> ...

  8. go socket、http网络编程demo

    1.socket通信 服务端接收数据 package main import ( "fmt" "net" "strings" ) func ...

  9. 一款开源的文件搜索神器,终于不用记 find 命令了

    这是 HelloGitHub 推出的<讲解开源项目>系列,用一篇文章带你快速上手有趣的开源项目. 今天给大家推荐一个好用+开源的文件搜索工具--fd 该工具支持大多数主流操作系统,快来更新 ...

  10. 查找SQL SERVER卡顿语句

    SELECT [session_id], [blocking_session_id] AS '正在阻塞其他会话的会话ID', DB_NAME([database_id]) AS '数据库名称', [r ...