如何保证netty执行事件是顺序而且高效?

ChangeZ 发布于 2015/05/29 21:07
阅读 1K+
收藏 0

服务器现在用的Netty。如果应用需要比较高的并发处理能力,如何保证每个链接的事件顺序执行,而且高效(即时间短)。顺序是指一个链接内发的请求A,B,C,D。按顺序A,B,C,D顺序执行,而且是A执行完,执行B,B结束后执行C,C结束后执行D。而不是A,B,C,D四个请求发上来一起并行处理。因为并行的话,就会有同步问题。

我现在的处理方法是把所有的链接发上来的请求放到不同的队列中(同一个链接的请求确保在同一个队列),然后再一个个执行,这样可以保证执行事件的顺序,但是不能保证效率。因为如果链接数比较多,比如1000个链接,那么要处理的事件就会很多,多个队列处理能力就会下降,事件在队列中等待的时间就会加长。

那么,如果保证顺序执行的前提下,保证效率呢?


加载中
0
zigzagroad
zigzagroad
不考虑资源占用的话,你的处理方式(每个用户一个队列)就可以了
ChangeZ
ChangeZ
这个有点太耗资源了,不过谢谢,提供一种思路
0
公孙二狗
公孙二狗

任务队列不要太多,例如就10个,然后分配执行任务时用 queues[ID % 10],这个 ID 可以是链接的 Hash,每个链接的 Hash 是固定的,而消息是TCP传过来也是有序的,最终保证了消息的顺序执行。

ChangeZ
ChangeZ
好的,谢谢你
公孙二狗
公孙二狗
回复 @funinput : 机器性能就这样了,已经不是线程多少能解决的问题,增加服务器,用负载均衡吧,没个客户端的访问都定位到同一个Server,我们是在Cookie里加了个标志。
ChangeZ
ChangeZ
我现在就是这样做的,但是怎么保证效率?比如说瞬时的大量请求。那么就会有很多人的请求要等待。
0
kakai
kakai

Tcp的消息本就是有序的,netty内部本就使用了一个List队列,为什么自己还要再写个队列去处理?netty内部有线程池,不需要你再手动开启线程去处理消息的。

netty线程池的多少配置:在NioEventLoopGroup构造中有指定线程池数量和类型的

ChangeZ
ChangeZ
我要求的是同一个链接,同一时间点只有一个指令在执行,不会存在多个指令并发执行。我没有说netty的请求不是顺序的
返回顶部
顶部