什么是Session?
由于HTTP本身是属于无状态协议,所以我们 如果要在多次单独的HTTP请求中实现对话,那么就是通过每次对话开始都会分配一个会话标识(Session ID),通过Cookie把这个标识告诉浏览器,以后每次请求的时候,浏览器都会带上这个会话标识来告诉浏览器,以后每次请求的时候,浏览器都会带上这个会话标识来告诉Web服务器请求时属于哪个会话的。
问题在哪里?
Session的建立如果是在单机内存中,没有做持久化操作(存入数据库)的话,那么是容易丢失的。不仅如此,在分布式系统中,如何保证每一次发起请求方的请求都能被同一台申请请求服务器处理?
解决方案:
1.Session Sticky
这种解决方案是针对Session存储在单机内存中,让每次请求都通过负载均衡器最终落到同一个服务端进行处理。
缺点:因为Session还是存储在内存中,那么每次服务器宕机或者重启都会造成会话数据的丢失
SessionID解析是应用层的处理,那么每次应用层的解析相比之前TCP在传输层的解析会造成更大的处理开销。
负载均衡器为了保存会话中请求方和处理方的映射变成了一个有状态的节点,将会耗费更多内存。
2.Session Replication
这种解决方案是要求每一个服务节点都保存一个SessionID,但是这种方式无疑是极其浪费资源的。
(1)在每个服务节点之间同步Session造成了网络带宽的开销。
(2)在内存中存储了过多的SessionID占用了内存资源。
3.Session 数据集中存储
一般来说就是把Session集中存储到一些特定的节点上,redis就是很好的选择。
4.Cookie Based
把所需要的会话信息都存储在Cookie中,每次通过Cookie提供的信息在服务端生成Session。
缺点非常明显:
(1)Cookie长度很有限,这样会限制Session的数据长度,同时限制了所能承载的信息
(2)Cookie存储在客户端上,及其容易被第三方获取,安全性很低。
(3)性能影响,因为每次请求都需要带上完整的会话数据,占用了大量带宽。