当前位置: 首页 > 编程笔记 >

Java分布式session存储解决方案图解

姬歌者
2023-03-14
本文向大家介绍Java分布式session存储解决方案图解,包括了Java分布式session存储解决方案图解的使用技巧和注意事项,需要的朋友参考一下

前言

本文主要探讨集群后不同Web服务器获取Session数据的问题解决方案。

Session Stick

Session Stick 方案即将客户端的每次请求都转发至同一台服务器,这就需要负载均衡器能够根据每次请求的会话标识(SessionId)来进行请求转发,如下图所示。

这种方案实现比较简单,对于Web服务器来说和单机的情况一样。但是可能会带来如下问题:

如果有一台服务器宕机或者重启,那么这台机器上的会话数据会全部丢失。

会话标识是应用层信息,那么负载均衡要将同一个会话的请求都保存到同一个Web服务器上的话,就需要进行应用层(第7层)的解析,这个开销比第4层大。

负载均衡器将变成一个有状态的节点,要将会话保存到具体Web服务器的映射。和无状态节点相比,内存消耗更大,容灾方面也会更麻烦。

Session Replication

Session Replication 的方案则不对负载均衡器做更改,而是在Web服务器之间增加了会话数据同步的功能,各个服务器之间通过同步保证不同Web服务器之间的Session数据的一致性,如下图所示。

Session Replication 方案对负载均衡器不再有要求,但是同样会带来以下问题:

同步Session数据会造成额外的网络带宽的开销,只要Session数据有变化,就需要将新产生的Session数据同步到其他服务器上,服务器数量越多,同步带来的网络带宽开销也就越大。

每台Web服务器都需要保存全部的Session数据,如果整个集群的Session数量太多的话,则对于每台机器用于保存Session数据的占用会很严重。

Session 数据集中存储

Session 数据集中存储方案则是将集群中的所有Session集中存储起来,Web服务器本身则并不存储Session数据,不同的Web服务器从同样的地方来获取Session,如下图所示。

相对于Session Replication方案,此方案的Session数据将不保存在本机,并且Web服务器之间也没有了Session数据的复制,但是该方案存在的问题在于:

读写Session数据引入了网络操作,这相对于本机的数据读取来说,问题就在于存在时延和不稳定性,但是通信发生在内网,则问题不大。

如果集中存储Session的机器或集群出现问题,则会影响应用。

Cookie Based

Cookie Based 方案是将Session数据放在Cookie里,访问Web服务器的时候,再由Web服务器生成对应的Session数据,如下图所示。

但是Cookie Based 方案依然存在不足:

Cookie长度的限制。这会导致Session长度的限制。

安全性。Seesion数据本来是服务端数据,却被保存在了客户端,即使可以加密,但是依然存在不安全性。

带宽消耗。这里不是指内部Web服务器之间的宽带消耗,而是数据中心的整体外部带宽的消耗。

性能影响。每次HTTP请求和响应都带有Seesion数据,对Web服务器来说,在同样的处理情况下,响应的结果输出越少,支持的并发就会越高。

总结

前面四个方案都是可行的,但是对于大型网站来说,Session Sticky和Session数据集中存储是比较好的方案。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 问题内容: 我的任务是为可大规模扩展的分布式共享内存(DSM)应用程序构建原型。原型仅用作概念验证,但我想通过选择稍后在实际解决方案中使用的组件来最有效地利用我的时间。 该解决方案的目的是获取来自外部源的数据输入,将其搅动并使结果可用于许多前端。这些“前端”将仅从缓存中获取数据并提供服务,而无需额外的处理。该数据的前端命中量实际上可以是每秒数百万。 数据本身非常不稳定。它可以(并且确实)快速变化。

  • 本文向大家介绍JAVA内存溢出解决方案图解,包括了JAVA内存溢出解决方案图解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了JAVA内存溢出解决方案图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.在apache-tomcat-7.0.70\bin\catalina.bat(Linux 系统则在catalina.sh) 文件下

  • 问题内容: 我们的生产Web服务器有一台运行Windows Server 2003的服务器。我们的网站具有不同的模块,每个模块都在其自己的应用程序池中运行。由于每个模块都有自己的缓存,而且经常有多个模块缓存相同的项目,因此这使缓存有点问题。问题是,当在一个模块中更改了缓存中的项目时,无法轻松地刷新缓存同一项目的另一个模块。 我们的网站是用ASP.NET 4.0编写的,我们使用标准的HttpRunt

  • 主要内容:1.2PC,2.三阶段提交(3PC),3.补偿事务(TCC),4.本地消息表,5.消息事务,6.最大努力通知,7.Sagas 事务模型1.2PC 两阶段提交 mysql是通过日志系统完成事务的。就是两阶段提交:undolog和binlog的两阶段提交。 两阶段协议可以用于单机集中式系统,由事务管理器协调多个资源管理器;也可以用于分布式系统,由一个全局的事务管理器协调各个子系统的局部事务管理器完成两阶段提交。 第一阶段:投票阶段 1.协调者写命令进写入日志 2.协调者发一个prepare

  • 了解 CSS 中属性的值及其特性, 透彻分析问题和需求才可以选择和设计最适合的布局解决方案。 居中布局 水平居中 子元素于父元素水平居中且其(子元素与父元素)宽度均可变。 inline-block + text-align <div class="parent"> <div class="child">Demo</div> </div> <style> .child { disp

  • 问题内容: 我正在寻找可以在不具有本机支持的浏览器上模拟的javascript库和代码。 基本上,我想对我的网站进行编码以用于存储数据,并且知道它仍然可以在本身不支持它的浏览器上运行。这意味着库将检测是否存在,并在存在时使用它。如果不存在,那么它将通过在名称空间中创建自己的实现来创建某种本地存储的后备方法。 到目前为止,我已经找到了以下解决方案: 简单的sessionStorage实现。 使用co