Session管理----分流技术

Posted leiandjing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Session管理----分流技术相关的知识,希望对你有一定的参考价值。

1,高并发的分流技术
tomcat的并发瓶颈:很难突破1000
测试场景:
硬件资源:如CPU的核数,内存
2,WEB层面使用nginx分流,轻量级的WEB服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
特点:占用内存少,并发能力强,稳定
稳定的原因:因为每次开启的时候都会创建两个进程,一个主进程和一个守护进程
如果主进程宕机,守护进程检测到以后,会将主进程从新开启。
配置文件是学习nginx的基础,conf目录 upstream(上游) 接收请求处理和转发,我们主要用的就是转发,
基于负载均衡+反向代理----也就是分流技术
默认的策略:轮询策略
实现横向扩展
问题:带来session丢失的问题。
3,session管理,解决session丢失的问题有三大解决方案
一,粘性session
实现思路:利用nginx自身提供的负载均衡策略实现;
优点:实现简单,对应用无侵入性,无额外开销;
缺点:一旦某个web服务器重启或者宕机,相对应的session数据丢失。对nginx负载均衡的能力进行了弱化;
使用场景:对稳定性要求不是很高的业务场景

nginx可以实现热加载:nginx -s reload
IP_HASH:根据客户端IP地址进行hash计算,取模,然后路由到指定的web服务器,如果服务器挂了,nginx会重新计算,路由到新的web服务器上。
弱化了nginx的负载均衡的能力:因为可能web服务器的流量高,有的流量低。


二,服务器session复制
实现思路:在支持session复制的web服务器上,通过配置可以实现session同步到其他web服务器上,达到每个web服务器上都保存一致的session全量;
优点:对应用无侵入性,服务器重启或宕机不会造成session丢失;
缺点:需要依赖支持的web服务器,在数据量很大的情况下不仅占用网络资源,而且会导致延迟;
使用场景:只适用于web服务器比较少,且在线用户量比较少的情况下(session数据量少的场景)。
经验:5台服务器以内

首先找到支持session复制的服务器
1,在所有工程的web.xml配置文件里加一行配置:<distributable/>分布式部署;
2,tomcat的server.xml的配置文件也需要配置:Cluster标签;
3,重启tomcat。
占用内存资源(如果请求用户量比较大的情况下,需要开辟一个空间用于保存session);
通过TCP协议长连接的方式,主播网络协议,使用同步非阻塞的NIO的数据传递和分享


三,session共享机制
实现思路:使用缓存技术,集中管理所有的session,所有的web服务器都从这个存储介质中存取对应的session,实现session共享;
优点:可靠性高,减少web服务器的资源开销;服务器重启或宕机不会造成session丢失;
缺点:实现上有些复杂,配置较多;增加一次网络开销;
使用场景:web服务器较多,要求高可用的情况。
对应用的侵入性体现在:
1,引入jedis,spring对redis操作的jar包
2,web.xml加入filter,
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3,在spring配置文件中配置redis的连接
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100"/>
<property name="maxIdle" value="10"/>
</bean>

<bean id="jedisPoolConfigFactory" class="org.springframework.data.redis.connection.jedis.JedisPoolConfigFactory" destory-method="destory">
<property name="hostName" value="localhost"/>
<property name="port" value="6379"/>
<property name="timeout" value="3000"/>
<property name="usePool" value="true"/>
<property name="poolConfig" value="jedisPoolConfig"/>
</bean>

<bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.redisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSession" value="600"/>
</bean>

tomcat对一次http是一个标准的接口,有具体的servlet容器实现
一次http请求--Tomcat--Container--Engine--Host--Context--Wrapper--Servlet--SessionManger--sessions--session

目前互联网的架构图:
页面层
|
网络层
|
应用层--nginx负载均衡---静态资源服务器集群和应用服务器集群---分布式单点登陆服务器
|
服务层--分布式服务器集群--搜索中间件/配置注册中心/分布式存储/分布式消息中间件
| 分布式数据库中间件(mycat)
数据层--文件服务器集群 mysql数据库集群(读写分离/分库分表)







































































以上是关于Session管理----分流技术的主要内容,如果未能解决你的问题,请参考以下文章

摘自大型网站技术架构书应用服务器集群的session管理

Shiro Session管理——操作session

Spring中自定义Session管理,Spring Session源码解析

会话管理——cookie和session技术

急急 急!在asp管理后台当中,设置session值,各几分钟就会丢失,怎么解决啊。 求助!

SpringSecurity的session管理