0.前言
cookie:
网站通常将用户的信息以Key/Value的形式存储在用户的本地机器中,包括持久化(文件存储)和非持久化(内存存储,浏览器关闭即销毁)两种存储形式。
session:
http是一种无状态的协议,为了追踪客户的访问状态,需要使用session来存储用户和服务器的状态信息。
通常用户在第一次访问服务器时,服务器会为用户创建一个session,创建session的唯一标识sessionId,以后用户访问服务器时,都会带上这个sessionId,服务器以此来判断请求属于哪个session。
session存在的问题:
⦁ 像淘宝这样具有上亿用户访问的系统,服务器存储用户的session信息,显然会耗费大量的内存,任何单台服务器都没有办法解决的;
⦁ 当采用服务器集群部署应用时,对用户来说,服务器集群相当于同一服务器,用户的2次请求可能会被分配到2台不同服务器上处理,如何保证2次请求获取的用户session是一致的?
有很多session框架解决了这些问题,如:
⦁ webx提供的session管理功能:不同的store方式选择
⦁ alisession框架:2017年以前1688的应用使用的是alisession框架
⦁ tbsession框架:现在集团应用统一迁移到tbsession框架
1.tbsession
阿里内部小二账户使用
1.1原理
tbsession是如何解决这些问题的?
⦁ 结合客户端和服务端来存储用户session信息;
⦁ 客户端采用cookie存储;
⦁ 服务端使用tair存储;
⦁ 通过配置文件决定存储在cookie中 或 tair中(我们现在应用一般都采用tair存储);
⦁ 配置文件存储在diamond-server上,实现动态更新;
tbsession的工作原理:
⦁ tbsession通过TaobaoSessionFilter对外提供服务
⦁ tbsession扩展了标准的HttpSession
⦁ tbsession依赖diamond server和tair
⦁ tbsession的类关系图:
⦁ 工作流程:当一个请求到达服务端的时候,服务器会判断这个请求是否带有sessionID标识,如果没有,服务端会为该请求创建一个sessionID,如果该请求带有sessionID,则服务端会根据这个sessionID把该session取出来使用。
tbsession工作流程:
图 tbsession的Filter工作流程图
1.2部署
分布式缓存:
⦁ 采用tair存储,支持mdb和ldb两种存储
⦁ 独立的多单元数据同步实现(写:先写本机房的机器【主,依据键的hash值取】,再异步写异地机房中的一台机器【备】;读:读主机,如果主机坏了再读备机,并将备机切换为主机)
⦁ 容灾