读书人

负载均衡引发的线程变量有关问题

发布时间: 2012-11-07 09:56:10 作者: rapoo

负载均衡引发的线程变量问题

公司现在打算使用两个tomcat来进行负载均衡, 调试时发现了问题.

以前没有使用负载均衡时,前台是没有显式的将用户ID传入业务层的, 而是将它设置在线程变量中. 现在使用了两个tomcat, 当一个用户线程从一个tomcat转向另一个时, 他就不能操作他的资源了, 因为线程已经不是原来的那个线程, 其中已经没有了用户ID,这相当于是没有登录的状态. 如果要将用户ID作为一个调用参数传入业务层的话, 接口改动将会很大.
请问各位有什么好的办法可以解决这个问题, 或者是有其它的折衷的方法可以避免对接口的过大程度的修改?
谢谢! 1 楼 dennis_zane 2007-07-20 用户id为什么不放在session里?集群复制下session 2 楼 ddandyy 2007-07-20 让后续请求一直访问最初被负载过去的服务器就好了 最简单可以通过在request里加一个变量来实现

或者通过设置负载服务器??? 我们以前有做过类似的东西 肯定可以做的 不过不是我做的....-_- 不知道是怎么做的 3 楼 hunteagle 2007-07-20 dennis_zane 写道用户id为什么不放在session里?集群复制下session
session对业务层是不可见的吧 4 楼 hunteagle 2007-07-20 ddandyy 写道让后续请求一直访问最初被负载过去的服务器就好了 最简单可以通过在request里加一个变量来实现

或者通过设置负载服务器??? 我们以前有做过类似的东西 肯定可以做的 不过不是我做的....-_- 不知道是怎么做的

可"最初被负载过去的服务器"可能根本就已经down掉了...
通过设置负载服务器? 可以吗? 有没有具体的方法, 谢谢了! 5 楼 dennis_zane 2007-07-20 hunteagle 写道dennis_zane 写道用户id为什么不放在session里?集群复制下session
session对业务层是不可见的吧
是我误解了。请忽略。 6 楼 janh 2007-07-20 <br/>
<strong>hunteagle 写道:</strong><br/>
<div class='quote_div'>以前没有使用负载均衡时,前台是没有显式的将用户ID传入业务层的, 而是将它设置在线程变量中. 现在使用了两个tomcat, 当一个用户线程从一个tomcat转向另一个时, 他就不能操作他的资源了, 因为线程已经不是原来的那个线程, 其中已经没有了用户ID,这相当于是没有登录的状态. 如果要将用户ID作为一个调用参数传入业务层的话, 接口改动将会很大. <br/>
请问各位有什么好的办法可以解决这个问题, 或者是有其它的折衷的方法可以避免对接口的过大程度的修改?<br/>
谢谢!</div>
<br/>
<br/>
<br/>
<br/>
一次request处理跨两个tomcat?? 用户登录信息放在request、线程中?? 7 楼 ddandyy 2007-07-20 down掉? 那就重新登陆好了 难道你服务器天天down么

你这个要求就高了 难道要两个服务器随时随便切换 你不要session了? 所有东西全在request里? 8 楼 hunteagle 2007-07-20 ddandyy 写道down掉? 那就重新登陆好了 难道你服务器天天down么
那倒不是, 因为最近开发新功能, 所以有时候需要重启服务器. 9 楼 ddandyy 2007-07-20 要么就让用户重新登陆 要么就忍着 等到后半夜没人的时候重启

就算是开发新东西 也不用一天重启好几次吧 难道你们不做一个稍稍好些的再往上放版本么 一天放好几次? 10 楼 LucasLee 2007-07-22 <br/>
<strong>hunteagle 写道:</strong><br/>
<div class='quote_div'>前台是没有显式的将用户ID传入业务层的, 而是将它设置在线程变量中. 现在使用了两个tomcat, 当一个用户线程从一个tomcat转向另一个时, 他就不能操作他的资源了, 因为线程已经不是原来的那个线程, 其中已经没有了用户ID,这相当于是没有登录的状态. <br/>
<br/>
<br/>
</div>
<br/>
<br/>
<br/>
<br/>
你的这个理解应当是不对的。<br/>
1)用户的ID如果保存在线程变量中,那么这个ID是瞬时状态的,下次用户访问,这个线程变量就不存在了。我觉得你可能没有理解你们现在如何保存用户ID的机制,一般来说,最终用户登录的状态数据都是保存在session中的。<br/>
<br/>
2)如果用户ID的确在线程变量中,那么对于是否处于集群环境下,应当是没有区别的。因为A服务器节点上的一个线程的处理,不会转入到B节点上。至于用户第一次访问由A处理,下一次可能由B处理,那完全不是线程的概念。即便没有集群,两次访问也不一定是同一个线程来响应。<br/> 11 楼 codeutil 2007-07-23
集群跟线程局部变量怎么扯的上关系???

12 楼 lllyq 2007-07-23 <br/>
<strong>hunteagle 写道:</strong><br/>
<div class='quote_div'>
<p>公司现在打算使用两个tomcat来进行负载均衡, 调试时发现了问题.</p>
以前没有使用负载均衡时,前台是没有显式的将用户ID传入业务层的, 而是将它设置在线程变量中. 现在使用了两个tomcat, <strong>当一个用户线程从一个tomcat转向另一个时, 他就不能操作他的资源了, 因为线程已经不是原来的那个线程</strong>, 其中已经没有了用户ID,这相当于是没有登录的状态. 如果要将用户ID作为一个调用参数传入业务层的话, 接口改动将会很大. <br/>
请问各位有什么好的办法可以解决这个问题, 或者是有其它的折衷的方法可以避免对接口的过大程度的修改?<br/>
谢谢!</div>
<br/>
<br/>
<br/>
怀疑对thread理解有误<br/>
即使是同一个tomcat两次请求也不能保证用同一个thread,所以每次请求开始时都应该清除thread中自己关心的数据,保证改次请求的数据不受之前request的影响 13 楼 myreligion 2007-07-23 如果只是增加一个tomcat,可以考虑采用session粘连的方式。用户请求以后,一直都会访问同一个tomcat;tomcat本身连集群都不需要做,对应用来说和单台tomcat没有任何区别。

读书人网 >软件架构设计

热点推荐