增量会话对象——DeltaSession
在集群环境中为了使集群中各个节点的会话状态都同步,同步操作是集群重点解决的问题,一般来说有两种同步策略,其一是每次同步都把整个会话对象传给集群中其他节点,其他节点更新整个会话对象;其二是对会话中增量修改的属性进行同步。这两种同步方案各有优缺点,整个会话对象同步策略实现过程比较简单方便,但会造成大量无效信息的传输。增量同步方式则不会传递无效的信息,但在实现上会比较复杂因为涉及到对会话属性操作过程的管理。
这节讨论的正是增量同步方式中涉及的会话对象DeltaSession,这个对象其实是对标准会话对象的扩展使之具备在整个请求过程记录会话所有的增量更改。DeltaSession的类图如下,除了继承StandardSession类外还实现了Externalizable、ClusterSession、ReplicatedMapEntry三个接口,Externalizable接口主要提供对外部的对象读写操作,ClusterSession接口主要提供判断集群会话是否为原始的会话操作,只有原始会话才有资格使会话过期,ReplicatedMapEntry接口提供差异复制的操作。对于DeltaSession其实就是除了继承StandardSession特性外还要额外实现这三个接口。
当客户端发起一个请求时,服务端对请求的处理可能涉及会话相关的操作,例如获取客户端某些属性再根据属性值进行逻辑处理,而且在整个请求过程中可能涉及多次的会话操作,为了将这些改变能同步到集群的其他节点上,必须要有一个机制来实现,实际上同步的颗粒度大小是很重要,颗粒度太大会导致同步不及时,而颗粒度太小则可能导致传输及性能问题,考虑到性能及可行性,tomcat同步的颗粒度是以一个完整的请求为单位的,即从客户端发起请求到服务器完成逻辑处理返回结果之前这段时间为同步颗粒度。这个过程中对某会话的所有操作(对同一个属性的操作只记录最新的操作)都会被记录下来,如下图,绿色箭头表示一个完整的请求过程,期间包括了四个修改属性操作,分别修改了属性a、b、c、d,这四个操作会被抽象成四个动作放进一个列表中,集群其他节点获取列表后根据这些动作就可以对自己本地对应的会话进行同步。
集群成员接收到某节点发送过来的同步消息后,将会逐一执行动作集里面的每个动作,下图大箭头表示同步的整个过程,最下面的为动作集列表,一共有4个动作,按顺序首先取出第一个update1动作,动作对象里面包含了指定修改哪个会话的会话id,根据此id去修改会话集对应的会话的属性。接着把剩下的其余3个动作执行完毕,于是完成了会话同步。
在tomcat中会话增量的具体由DeltaSession类实现,DeltaSession继承了StandardSession标准会话的所有特性且增加了会话增量记录的功能,增量记录功能即通过动作集实现,动作集被封装在DeltaRequest类,所以DeltaSession主要通过DeltaRequest实现动作集的管理,动作集由一个LinkedList<AttributeInfo>结构保存,AttributeInfo描述了动作的一些消息,所以一个动作就被抽象成了一个AttributeInfo对象,它主要包含四个属性 name(String)、value(Object)、action(int)、type(int),name表示会话的属性名,即哪个属性被改;value表示会话属性名对应的值;action表示动作类型,可能是设置属性也可能是删除属性;type表示会话哪种类别的属性将被修改。
整个增量会话的实现机制就是上面所说的,会话的增量拷贝比起全量拷贝有很多好处,即使实现相对比较复杂。
喜欢java的同学可以加下好友
增量会话对象——DeltaSession的更多相关文章
- 集群增量会话管理器——DeltaManager
DeltaManager会话管理器是tomcat默认的集群会话管理器,它主要用于集群中各个节点之间会话状态的同步维护,由于相关内容涉及到集群,可能会需要一些集群通信相关知识,如果有疑问可结合集群相关章 ...
- 标准会话对象——StandardSession
Tomcat使用了一个StandardSession对象用来表示标准的会话结构,用来封装需要存储的状态信息.标准会话对象StandardSession实现了Session.Serializable.H ...
- Node.js_express_临时会话对象 session
临时会话对象 session 也是用来 解决 http 无状态协议的问题(无法区分多次请求是否发送自同一客户端) npm install express-session npm install con ...
- session会话对象
一.session会话对象介绍: 会话对象让你能够跨请求保持某些参数,它也会在同一个session实例发出的所有请求之间保持cookie. 二.步骤 1.对session对象进行一次实例化 2.进行登 ...
- [Xcode 实际操作]八、网络与多线程-(14)使用网址会话对象URLSession将地理坐标转换为地名
目录:[Swift]Xcode实际操作 本文将演示如果通过网址会话对象,将地理坐标转换为地名. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模式等优点. 在项目 ...
- [Xcode 实际操作]八、网络与多线程-(15)使用网址会话对象URLSession下载图片并存储在沙箱目录中
目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession下载图片并存储在沙箱目录中. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的 ...
- [Xcode 实际操作]八、网络与多线程-(16)使用网址会话对象URLSession下载图片并显示下载进度
目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession显示下载图片的进度. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模式 ...
- [Xcode 实际操作]八、网络与多线程-(17)使用网址会话对象URLSession向远程服务器上传图片
目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession向远程服务器上传图片. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模 ...
- Python Requests-学习笔记(10)-会话对象
会话对象让你能够跨请求保持某些参数.它也会在同一个Session实例发出的所有请求之间保持cookies. 会话对象具有主要的Requests API的所有方法. 我们来跨请求保持一些cookies: ...
随机推荐
- Android 的 Sqlite基本操作
在 SQL 数据库中保存数据 使用数据库 将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选. 本课程假定您基本熟悉 SQL 数据库并且可帮助您开始在 Android 中使用 SQL ...
- ROS常用三維機器人仿真工具Gazebo教程匯總
參考網址: 1. http://gazebosim.org/tutorials 2. http://gazebosim.org/tutorials/browse Gazebo Tutorials Ga ...
- JBOSS EAP6 系列二 客户端访问位于EAR中的EJB时,jndi name要遵守的规则
EJB 的 jndi语法(在整个调用远程ejb的过程中语法的遵循是相当重要的) 参见jboss-as-quickstarts-7.1.1.CR2\ejb-remote\client\src\main\ ...
- [struts2学习笔记] 第五节 编写struts2的action代码
本文地址:http://blog.csdn.net/sushengmiyan/article/details/40479299 官方文档: http://struts.apache.org/relea ...
- 【iOS 开发】基本 UI 控件详解 (UIButton | UITextField | UITextView | UISwitch)
博客地址 : http://blog.csdn.net/shulianghan/article/details/50051499 ; 一. UI 控件简介 1. UI 控件分类 UI 控件分类 : 活 ...
- [openwrt] uci 的shell和lua接口
uci是openwrt上配置操作的接口,不管是自动化的shell脚本,还是使用luci来二次开发配置界面,都会用到这部分知识. uci提供了lua, shell, c接口,这里主要用到了前两种 she ...
- Swift基础用法(Swift开发之一)
昨晚苹果发布了新一代编程语言Swift,官方提供了一个iBook的说明文档,有需要的可以看下.地址:https://itunes.apple.com/cn/book/swift-programming ...
- 精通CSS+DIV网页样式与布局--页面背景
上篇博客,我们主要简单的总结了CSS的图片效果,我们这回来讲讲CSS如何对网页的背景进行设置,网页的背景是整个网页的重要组成部分,她直接决定了整个网页的风格和色调.这篇博客简单的总结一下如何用CSS来 ...
- String类用法总结
String类在编程中出现的频率是非常高的,熟练掌握是很有必要的 一.常用方法总结: 获取方法 1.1:字符串中包含的字符数,也就是字符串的长度. int length():获取长度 1.2:根据位置 ...
- Android屏幕适配-android学习之旅(五十九)
android屏幕适配