详解Tomcat集群如何同步会话

2019-10-18 15:41:49丽君

这里写图片描述

接着分析Tomcat对上面机制详细的实现,正常情况下为了支持高效的并发操作,tomcat的所有会话集使用ConcurrentHashMap

public Object put(Object key, Object value) {
  ①实例化MapEntry,将key和value传入,并设置源节点为目前节点。
  ②判断本地内存是否已包含key,如是则不仅要本地remove掉,还要跨节点remove。
  ③通过Round robin算法从MapMember中选择一个作为备份节点。
  ④实例化一个包含MSG_BACKUP标识的MapMessage对象并发送给备份节点。
  ⑤实例化一个包含MSG_PROXY标识的MapMessage对象并发送给除了备份节点外的其他(代理)节点。
  ⑥put进本地缓存。
}

其次,再看看它如何通过get实现获取会话对象操作:

public Object get(Object key) {
 ①获取本地的MapEntry对象,它或许直接包含了会话对象,或许包含了会话对象的存放位置信息。
 ②判断本节点是否属于源节点,如为源节点则直接获取MapEntry对象里面的会话对象并返回。
 ③判断本节点是否属于备份节点,若为备份节点则直接获取MapEntry对象里面的会话对象作为返回对象,并且还要将本节点升为源节点、重新选取一个新备份节点,把MapEntry对象拷贝到新备份节点。
 ④判断本节点是否属于代理节点,若为代理节点则向其他节点发送会话对象拷贝请求,“集群中谁有此会话对象请发送给我”,把接收到的会话对象放到本节点并作为返回对象,最后将本节点升为源节点。
}

最后,看看删除会话对象remove操作的实现:

public Object remove(Object key) {
 ①删除本地此MapEntry对象。
 ②广播其他节点删除此MapEntry对象。
}

通过上面三个方法已经很清晰描述了新的Map是如何进行跨节点的增删改查的,BackupManager会话管理器就是通过这个新的Map进行会话管理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。