`
hunteagle
  • 浏览: 88788 次
社区版块
存档分类
最新评论

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

阅读更多

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

以前没有使用负载均衡时,前台是没有显式的将用户ID传入业务层的, 而是将它设置在线程变量中. 现在使用了两个tomcat, 当一个用户线程从一个tomcat转向另一个时, 他就不能操作他的资源了, 因为线程已经不是原来的那个线程, 其中已经没有了用户ID,这相当于是没有登录的状态. 如果要将用户ID作为一个调用参数传入业务层的话, 接口改动将会很大.
请问各位有什么好的办法可以解决这个问题, 或者是有其它的折衷的方法可以避免对接口的过大程度的修改?
谢谢!
分享到:
评论
13 楼 myreligion 2007-07-23  
如果只是增加一个tomcat,可以考虑采用session粘连的方式。用户请求以后,一直都会访问同一个tomcat;tomcat本身连集群都不需要做,对应用来说和单台tomcat没有任何区别。
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的影响
11 楼 codeutil 2007-07-23  

集群跟线程局部变量怎么扯的上关系???

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/>
9 楼 ddandyy 2007-07-20  
要么就让用户重新登陆   要么就忍着  等到后半夜没人的时候重启

就算是开发新东西  也不用一天重启好几次吧  难道你们不做一个稍稍好些的再往上放版本么  一天放好几次?
8 楼 hunteagle 2007-07-20  
ddandyy 写道
down掉?  那就重新登陆好了   难道你服务器天天down么

那倒不是, 因为最近开发新功能, 所以有时候需要重启服务器.
7 楼 ddandyy 2007-07-20  
down掉?  那就重新登陆好了   难道你服务器天天down么

你这个要求就高了  难道要两个服务器随时随便切换   你不要session了? 所有东西全在request里?
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、线程中??
5 楼 dennis_zane 2007-07-20  
hunteagle 写道
dennis_zane 写道
用户id为什么不放在session里?集群复制下session

session对业务层是不可见的吧

是我误解了。请忽略。
4 楼 hunteagle 2007-07-20  
ddandyy 写道
让后续请求一直访问最初被负载过去的服务器就好了   最简单可以通过在request里加一个变量来实现

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


可"最初被负载过去的服务器"可能根本就已经down掉了...
通过设置负载服务器? 可以吗? 有没有具体的方法, 谢谢了!
3 楼 hunteagle 2007-07-20  
dennis_zane 写道
用户id为什么不放在session里?集群复制下session

session对业务层是不可见的吧
2 楼 ddandyy 2007-07-20  
让后续请求一直访问最初被负载过去的服务器就好了   最简单可以通过在request里加一个变量来实现

或者通过设置负载服务器???   我们以前有做过类似的东西  肯定可以做的  不过不是我做的....-_-  不知道是怎么做的
1 楼 dennis_zane 2007-07-20  
用户id为什么不放在session里?集群复制下session

相关推荐

    多线程使用消息队列

    这种方式可以实现任务的异步处理,提高系统吞吐量,同时避免了线程直接通信可能引发的问题。 例如,在聊天应用(如`chat`)开发中,多线程可以用于处理用户的输入、网络I/O和UI更新,而消息队列可以用于缓存和分发...

    基于posix多线程编程指南

    3. **负载均衡**:根据任务性质和线程能力进行任务分配,确保资源利用率。 总结来说,POSIX多线程编程涉及线程创建、同步机制、线程安全以及性能优化等多个方面。理解并熟练掌握这些概念和技术,可以帮助开发者编写...

    dbproxy的线程分发设计的讨论过程1

    【dbproxy线程分发设计...综上所述,dbproxy的线程分发设计改进旨在解决并发处理中的负载均衡、死锁问题,并优化连接池的管理,以提高服务的稳定性和效率。设计者们正通过深入探讨不同的策略,以寻找最佳的解决方案。

    线程资源问

    9. **性能优化**:通过合理分配线程数量、负载均衡、避免不必要的同步等方式,提高多线程程序的性能。 通过深入学习和实践`ThreadMultiSample`中的代码,开发者可以更好地理解和掌握线程资源管理的相关知识,提升多...

    多线程扫描器源代码

    6. **负载均衡**:为了最大化硬件资源的利用率,需要合理分配任务到各个线程,避免某些线程过载而其他线程空闲。 7. **异常处理**:在多线程环境中,必须考虑如何处理不同线程可能出现的异常,并确保不会因一个线程...

    Intel多核多线程编程基础(Linux)

    - **负载均衡**:确保各个线程的工作量大致相同,避免部分线程空闲,浪费计算资源。 - **减少上下文切换**:频繁的线程切换会消耗大量CPU时间,应尽量减少不必要的线程切换。 - **缓存一致性**:优化数据访问模式,...

    多线程实现脏字及不和谐文字的过滤(高效)

    可以使用负载均衡策略,确保各个线程的工作量大致相等,提高整体效率。 4. **关键词匹配算法**:每个线程负责检查其分配到的文本块,使用高效的字符串匹配算法,如KMP(Knuth-Morris-Pratt)或Boyer-Moore,快速...

    某应用内存溢出(暨jvm)分析分享

    2. **栈内存**:每个线程都有自己的程序计数器、虚拟机栈和本地方法栈,用于存储方法调用过程中的局部变量、方法参数等。如果栈空间不足,会抛出`java.lang.StackOverflowError`。 3. **方法区(元空间)**:存储类...

    走向架构师之路

    8. **ThreadLocal**:ThreadLocal是Java中用于线程局部变量的类,它可以为每个线程创建独立的变量副本,避免多线程环境下共享数据引发的并发问题。但在大型系统中,合理使用并注意内存泄漏是必要的。 9. **基于...

    解决共享错误

    优化网络通信、使用负载均衡和分布式协调服务(如Zookeeper)可以帮助解决这类问题。 **七、分布式事务** 在分布式环境中,保持事务的ACID(原子性、一致性、隔离性和持久性)属性至关重要。两阶段提交、三阶段提交...

    java高并发视频讲解

    8. **分布式并发**:在大型系统中,高并发可能涉及到分布式系统的设计,如负载均衡、分布式缓存、分布式事务处理等,这些问题需要结合Java的RMI、JMS、JNDI等技术来解决。 通过本视频讲解,你将能系统地掌握Java高...

    03 多核编程基本概念

    - **负载均衡**:合理分配任务给各个处理器核心,确保所有核心都得到有效利用。 - **减少上下文切换**:上下文切换会消耗时间,尽可能减少线程数量和任务切换频率可以提高程序的整体性能。 - **利用缓存局部性**:...

    The Art of Concurrency

    8. **性能优化**:通过线程池、任务调度、负载均衡等手段,优化并发程序的性能,避免过度创建销毁线程带来的开销,提高系统整体吞吐量。 9. **并发调试与测试**:并发程序的调试往往比单线程程序更复杂,需要借助...

    互联网大厂Java工程师岗位面试真题

    一致性哈希算法用于负载均衡,解决分布式系统中节点动态增减时,数据分布变动最小的问题。 【CAP原则】 分布式系统中,无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition ...

    南开21秋-并行程序设计答案.pdf

    23. **OpenMP循环调度策略**:调度策略不影响计算总量,因为它只是改变了任务分配的方式,但可能影响负载均衡、调度开销和数据局部性。 24. **多线程求和**:简单地将循环范围拆分给每个线程可能导致负载不均,因为...

    数据库死锁案例

    通过手动创建存库线程对象数组,使每个线程只处理特定集合内的终端消息,可以有效减少死锁风险,但负载均衡问题需要注意。 **案例2:数据处理死循环导致的表死锁** 在处理数据时,存在SQL语句循环执行的问题,导致...

    Java分布式应用学习笔记02再谈JVM

    JVM集群能够提供更高的可用性、负载均衡和故障恢复能力,是构建大规模、高并发分布式系统的基础。 #### 总结 通过对JVM的深入了解,我们可以更好地优化和管理Java分布式应用。从内存管理、线程模型、类加载机制到...

    科大讯飞笔试题汇总

    ### 科大讯飞笔试题知识点汇总 #### 一、STL库组成部分 ... - **负载均衡**:确保各线程的工作量均衡,避免某些线程过载。 - **并发容器**:使用专门为多线程设计的容器,比如`ConcurrentHashMap`等。

    Linux SMP HOWTO

    - **负载均衡**:确保应用程序能够跨多个处理器平衡负载。 - **锁的竞争**:减少锁竞争,提高并发性能。 - **I/O 操作**:优化 I/O 操作以充分利用 SMP 架构的优势。 ##### 2.3 SMP 编程 ###### 2.3.1 并行化...

Global site tag (gtag.js) - Google Analytics