分布式web架构中对session同步的常用处理方法以及优缺点
写在前面
最近在读一本来自淘宝技术团队大牛的书,名字叫《大型网站系统与Java中间件实践》。开篇的章节详细地介绍了一个网站架构由小变大不断演进的过程,其中从单机架构升级到集群架构的过程中着重介绍了关于session同步问题, 这也是很多人在聊到分布式时绕不过去的话题。下面就整理下书中的内容,也算是做个读书笔记,方便以后参考。
问题从哪来
做web开发的同学应该对session再熟悉不过,它是服务器分配给客户端的会话标识,浏览器每次请求会带上这个标识来告诉服务器我是谁,服务器会在内存中存储这些不同的会话信息,由此来分辨请求来自哪个会话。在单机部署的环境总,因为web服务器和session都是在同一台机器上,所以必然能找到对应的会话数据。但如果有2台web服务器(A和B)提供服务,假如第一次请求落到A上并创建了session,那么如何保证下次落到B的请求能读到session数据?

解决方案
有以下4中常见的解决方案。
1、Session Sticky
这是最简单粗暴的 方法,核心思路就是让同一会话的请求都落地到同一台服务器上,这样处理起来就和单机一样了,我们可以在负载均衡上做一些身份识别并控制转发来达到这个目的。这样做的优势是能像单机一样简化对session处理,也方便做本地缓存,但缺点也是很明显的:
如果这台服务器宕机或重启了,那么所以的会话数据都会丢失,失去了分布式集群带来的高可用特性。
增加了负载均衡器的负担,使它变得有状态了,而且资源消耗会更大,容易成为性能瓶颈。
2、Session Replication
顾名思义,这是一种session复制的方案,核心思路就是通过在服务器之间增加session同步机制来保证数据一致。

看起来比第一种简单了很多,也没有第一种带来的缺陷,但在某些应用场景下还是会有比较严重的问题:
服务器之间的数据同步带来了额外的网络消耗,随着机器数量和数据量的上升,网络带宽将会有很大的压力,也必然会带来延时问题。
每台服务器上都要存储所有的会话数据,如果会话数量很大会占用服务器大部分内存空间。
目前很多应用容器都支持这种同步方式,所以在集群规模和数据量比较小的时候还是一种很好的解决方案。
3、Session集中存储
这种方式的思路就是把所有的会话数据统一存储和管理,所有应用服务器需要对session进行读写都要通过session服务器来操作:

这种方案的好处是独立了session的管理,职责单一化,session服务器采用什么方式存储(内存、数据库、文档、NoSql等等),什么方式对外提供服务都是透明的。不会给应用系统和负载均衡带来额外的开销,不需要进行数据同步就能保证一致性,看起来应该是非常完美了,不过也有自己的一些小缺陷:
对session读写需要网络操作,相比较session直接存储在web服务器的时候增加了时延和不稳定性,好在session服务器和web服务器一般是部署在局域网中,可以最大化减少这个问题。
session服务器出现问题将影响所有web服务,如果采用多机部署同时也会带来数据一致性问题。
每种方案带有它独特的优势,同时也会带来相应的新问题,正所谓没有十全十美,只有适合才是最好的。总体来说,这种方案在应用服务器和会话数据量都很大的时候还是非常有优势的。
4、Cookie Base
这种方案是基于cookie的传输来实现的,核心思想很简单,就是把完整的会话数据经过处理后写入到客户端cookie,以后客户端每次请求都带上这个cookie,然后服务端通过解析cookie数据来获取会话信息,如下图所示:

这种方案简单明了,也没有前面几种方案带来的问题,但劣势也非常明显:
首先通过cookie来传递关键数据肯定是不安全的,即便是采用了特殊的加密手段。
如果客户端禁用了cookie,将直接导致服务不可用。
cookie的数据是有大小限制的,如果传递的数据超出限制大小,将会导致数据异常。
在http请求中携带大量的数据进行传输会增加网络负担,同样,服务端响应大量数据会导致请求变慢,并发量大的时候会非常可怕。
总结
以上4种方案都是可行的方案,正如前面所说,每种方案各有优劣,不会十全十美,实际应用中要根据需求做权衡和取舍。这些都是属于比较通用的方案,我相信在真正的实践和落地过程中还会有其他问题出现,有经验的过来人或许会有一些另辟蹊径的“套路”,欢迎讨论交流。
分布式web架构中对session同步的常用处理方法以及优缺点的更多相关文章
- Apache shiro集群实现 (八) web集群时session同步的3种方法
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- 【转】web集群时session同步的3种方法
转载请注明作者:海底苍鹰地址:http://blog.51yip.com/server/922.html 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问 ...
- web集群时session同步的3种方法[转]
在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...
- web集群时session同步的3种方法
在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...
- 介绍web开发中实现会话跟踪的常用技术方法
由于http是无状态的协议,这种特性严重阻碍了客户端与服务器进行动态交互,例如购物车程序,客户在购物车中添加了商品,服务器如何知道购物车已有的物品呢?为了支持客户端与服务器之间的交互,为了弥补http ...
- 软件架构设计学习总结(19):详解分布式系统中的session同步问题
几周前,有个盆友问老王,说现在有多台服务器,怎么样来解决这些服务器间的session同步问题?老王一下就来精神了,因为在n年以前,老王还在学校和几个同学一起所谓创业的时候,也遇到了类似的问题.当时查了 ...
- 关于web会话中的session过期时间的设置
关于web会话中的session过期时间的设置 1.操作系统: 步骤:开始——〉管理工具——〉Internet信息服务(IIS)管理器——〉网站——〉默认网站——〉右键“属性”——〉主目录——〉配置— ...
- ASP.NET Web Service中使用Session 及 Session丢失解决方法 续
原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Sessio ...
- javaEE开发中使用session同步和token机制来防止并发重复提交
javaEE开发中使用session同步和token机制来防止并发重复提交 通常在普通的操作当中,我们不需要处理重复提交的,而且有很多方法来防止重复提交.比如在登陆过程中,通过使用redirect,可 ...
随机推荐
- CSS设置一行文字,超出部分自动隐藏
.textone { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; line-height: 25px; max-h ...
- 盒子模型,定位技术,负边距,html5 新增标签
盒子模型 /*[margin 外边距] margin属性最多四个 1.只写一个值,四个方向的margin均为这个值 2.写两个值:上,右两个方向,下默认=上,右 默认=左 3.写三个值:上.右.下三个 ...
- hive集成sentry的sql使用语法
Sentry权限控制通过Beeline(Hiveserver2 SQL 命令行接口)输入Grant 和 Revoke语句来配置.语法跟现在的一些主流的关系数据库很相似.需要注意的是:当sentry服务 ...
- 【Android Developers Training】 107. 认知用户当前的行为
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- php随机获取验证码
<?php $yzm = ""; for($i=0;$i<5;$i++) { $a = rand(0,9); //0-9随机数 $yzm.= $a; } echo jo ...
- Vijos 1025 小飞侠的游园方案 0-1背包
描述 经过抽签选择,小智将军第一个进入考场. 菜虫:(身上散射出华贵(?)的光芒)欢迎你,第一位挑战者!! 小智:--(走到菜虫身后,关灯)女王陛下,虽然我们国家现在很富裕,但也请您不要浪费电来用这么 ...
- 妙用Outlook2003群发商业邮件
妙用Outlook2003群发商业邮件 我们知道,如果需要在Outlook 2003中向多个对象发送邮件,那么只需要在指定收件人时用分号输入多个邮件地址或者使用抄送方式即可:假如对象较多,可以使用 ...
- XManager与SecureCRT
使用Xmanager前,服务器必须已经安装好X11所需的各种运行包.运行下列命名检查安装情况,没有的话请自行补上. rpm -qa|grep x11 1.DISPLAY环境变量 export DISP ...
- AugularJS从入门到实践(一)
前 言 前端 AngularJS是为了克服HTML在构建应用上的不足而设计的.(引用百度百科) AngularJS使用了不同的方法,它尝试去补足HTML本身在构建应用方面的缺陷.Angu ...
- 快速查询List中指定的数据
时间:2017/5/15 作者:李国君 题目:快速查询List中指定的数据 背景:当List中保存了大量的数据时,用传统的方法去遍历指定的数据肯定会效率低下,有一个方法就是类似于数据库查询那样,根据索 ...