netty线程阻塞,自定义业务逻辑处理线程池问题

阿森lin1991 发布于 2015/05/04 16:22
阅读 9K+
收藏 0

netty还在学习中,资料说一般业务逻辑处理都自定义线程池来处理,防止nio线程得阻塞。现在是这样做的的,但是因为多线程并发问题,在很多业务逻辑处理的方法上都加了synchronized锁住,出现了问题:

如果自定义多个业务逻辑处理线程,线程的阻塞情况就比较严重(nio线程接收到的消息压入消息处理队列,业务逻辑线程池从队列中取消息进行处理,这个消息队列每次在改变,读取的时候都是同步的,再加上后续业务处理的很多方法也是同步(synchronized)的,测试4000并发时,不仅自定义的业务逻辑处理线程,nio线程阻塞情况也比较严重)最终导致不能正确的完成用户的一些处理...

后来只定义的一个业务逻辑处理线程,即单线程来处理业务逻辑,情况就好多了,但又出现新问题:就是在并发4000的样子,单线程处理一轮的用户请求可能忙不过来,服务器针对用户的每个请求都有一个超时时间,所以单线程的时候后台的离线检测会检测到很多玩家响应超时了(但其实玩家是即时响应了的,只不过单业务现象线程还没来得及处理)...最终导致一部分用户并未按照用户自己发送的数据进行,而是检测到为离线后的默认操作...

不会到大家在对基于netty服务器开发时,自定义的业务逻辑处理线程是怎样的?

加载中
0
zigzagroad
zigzagroad
Netty的worker线程只负责nio,在收到完整数据后将数据按要求封装并放入到业务数据队列;业务处理类负责从该队列中取出数据并处理。
这里的业务处理类现在是如何实现的?按你的说法,单线程和多线程 在这个类中都试验过,并且都没能解决问题,由此来看 可以得出2个结论:(1)需要再努力优化业务处理过程以节省处理时间;(2)提升服务器硬件性能。
xiaoyaoweizi
xiaoyaoweizi
回复 @阿森lin1991 : 我也是碰到这个问题,单位时间内大量客户端同时连接上来,服务端线程来不及处理。就大量堆积在队列里,请问有办法解决吗?
54ebb
54ebb
回复 @阿森lin1991 : 你netty什么版本?netty3和4的线程模型有不小区别,推荐infoq上李林峰写的《netty升级血泪史》
zigzagroad
zigzagroad
如果netty没有相应api接口的话,那就无解了。看看新版本中是否有,或者可以参考下
永远的洁丽雅
永远的洁丽雅
回复 @阿森lin1991 : 回复 @阿森lin1991 : 关键是netty接收消息队列消息时造成的阻塞;netty3.0中有ExecutionHandler可以使用(其实也是一个线程池,work执行到ExecutionHandler时直接返回执行下一个channel);我现在也遇到这样的问题,希望可以找到一起其他的解决办法,比如非阻塞接收消息队列消息。
阿森lin1991
2:接第1条...所以想把消息输出也放在nioEventLoopGroup(worker)线程中执行,即业务处理完后把输出消息压入输出队列,但是怎样才能调用nioEventLoopGroup(worker)线程去处理这个输出队列了?好像没有相关接口
下一页
0
强子大叔的码田
强子大叔的码田

1  netty本身的 worker线程的个数是根据CPU来的,直接在 worker线程里做业务逻辑处理不好么?

2 如果不想并发,修改源码,让worker线程个数为1,就没有并发了,这一点跟redis一样的,redis单线程的处理能力貌似也够用了,redis的作者是这么说的。

3 为啥要自定义多个业务逻辑线程?netty本身的worker线程拿到消息后就可以处理了啊

kakai
kakai
回复 @阿森lin1991 : 没必要为每个消息加业务逻辑处理线程,并发量多,线程自然多,这样跟IO模型就没区别了。收到数据后消息处理直接用worker线程,当你预估的业务逻辑实在是太费资源才开一个线程,这个线程中尽量不要有类变量已减少并发错误或人为加锁。实在不能满足需求,可以考虑用RMI把复杂逻辑放到另外的机器上做分布式处理
阿森lin1991
1.worker线程更多的负责读写网络数据,对于复杂或耗时的业务处理都交由自定义的逻辑线程处理,不然很可能阻塞nio线程,大大减少并发量。 2.我现在的情况不是worker线程并发有问题,而是自定义了逻辑线程并发有问题(阻塞情况比较严重) 3.同1 不过谢谢你...
0
ray_du
ray_du

你现在的问题跟Netty没有关系,主要是你的业务处理速度跟不上你所要求的请求速度,单线程也好,多线程也好,都没有关系。

处理不过来,

1,要不把超时的改掉或做优化处理

2,增强处理速度:找到瓶颈优化或者做请求分发到不同服务器处理

LouisYang
LouisYang
同意这种说法,最好是将业务线程能够优化
0
zigzagroad
zigzagroad
(2)提升服务器硬件以提高业务处理性能。
0
maydayclw
maydayclw
楼主你好,请问这个问题解决了吗?我先在也是遇到了这问题。
返回顶部
顶部