问题描述
集群WEB应用或多或少都会遇到session问题,多台服务器的情况下,session的要地存储会引起一些问题,影响用户体验。
下面列出这里我能想到的几种处理方法,各有优缺点配置Nginx负载策略,比如ip_hash,使客户端绑定在固定服务器上,这样最终用户访问到的机器是固定的,所以session存储在本地,不影响用户使用。但缺点主要有两项:
ip_hash分配并不均匀,尤其是用于ip_hash的Nginx不是最前端时,可能无法使用此策略
假如不考虑负载均匀问题,仍然存在的问题是,当后端某台机器宕掉时,这台机器上所有的session都会失去,假如session中记录的用户的认证状态,那么用户将变成未认证状态
服务器(Nginx代理的服务器)间进行session广播,这种方式存在的问题是,随着集群规模的扩张,广播的性能会变得很差,一般不推荐使用
使用session共享方案,具体使用redis还是使用memcached这里不讨论,这里假设使用redis,方法也很简单,将session的存储实现用redis替换掉,也可以使用HttpServletRequestWrapper方式来动态修改session的memcached-session-manager或者spring-session等实现,除了集中存储对性能(相对于本地存储)有一定影响,其它几乎完美,前提是实现代码够强壮
个人也想了一个有缺陷的办法,反正也只是设想,从来没用过。session广播的方式随着集群规模扩大,性能会下降,那么就不所有机器间广播,可以两台、三台之间广播,假设以两台为一组,所有集群中的服务器,以两台为单位分组,相互广播session,这时只需要保证相互广播的两台机器不同时挂掉即可(^_^ 貌似无法保证的吧!)
除了上面一的些方法,肯定还有其它办法,有兴趣的进来讨论一下补充记录[2016/9/1]个人认为完全可以避免使用session,servlet系的应用做分布式本就有很多限制,如果要实现分布式,最好的办法是利用http的无状态特性来实现,当然,用户登录、购物车等信息确实需要进行状态存储,这些完全可以直接存储到第三方存储中,比如:redis、mysql等,其本质上类似于session共享方案,但相对更加激进。
问题解答
回答1:你这里所说的session绝对部分说的是存登录信息吧?
如果是,那么统一登录服务应该也是一种方案