求教面向大规模连接的高并发网络模型

时间:2022-01-23 18:00:21
服务端在linux平台下,设计需要具备1w级别的最大连接处理能力。以前没有做过这样的东西,在网上搜的结果都是说epoll+线程池,epoll和线程池这两个我都知道,但结合起来自己设计了一个感觉有很大的问题,我的思路是主线程负责用epoll来处理客户端的请求事件,接收消息头后发给线程池用对应的函数进行处理,如果需要发回数据给客户端,处理函数将会把数据交给专门负责发送的另一个线程池进行发送,对于任何一个链接都保证每次发送都是串行的,不会交错以防止tcp流上的数据被打乱。但对于接收数据我就很无奈了,主线程负责接收消息头,剩余的内容由具体的处理函数接收的话,不加锁,可能会使得同一个客户端连续发来的几批数据的读取出现紊乱,比如a线程应该先读,之后b线程度,但由于a的处理稍慢,导致b抢先读取而发生错误。但加锁之后的效率就堪忧了,很多情况下简直就像是单线程。。。。。但是如果主线程直接读完整条消息再往后发,一遇到网络拥塞,没法很快读完整条消息,而主线程又只有一个,处理流程也就被阻塞了,网络情况好的时候还好,一旦某些客户端通信不畅就会对系统照成交大的影响。将主线程也做成多线程的模式的话,感觉不太好处理,如果非得这样倒也是可以做。哎,不管咋样,感觉这个模型实在是稀烂,想请教下现在这样的需求一般是怎么做的啊

3 个解决方案

#1


首先你要找出你系统最慢的部分,其实网络部分基本不会是一个大型server的瓶颈,更多的是业务,写数据库之类的,所以,你网络单线程就可以了,剩下的就是你先把你瓶颈业务拆出线程池,线程间交互都是靠消息队列的方式,其实从客户端发来数据,到你给客户端回包,整个业务流程还是一条线,并发的是你最耗时的操作去并发。

#2


别重复造*了,用libev,libevent,libuv,modo等开源库吧,他们底层封装的都很好, 求教面向大规模连接的高并发网络模型

#3


引用 2 楼 boyhailong 的回复:
别重复造*了,用libev,libevent,libuv,modo等开源库吧,他们底层封装的都很好, 求教面向大规模连接的高并发网络模型

我更多的是对技术的探索吧,不太像把开源库直接拿来用,不过能学习这样的优秀的开源库的设计思路也很不错

#1


首先你要找出你系统最慢的部分,其实网络部分基本不会是一个大型server的瓶颈,更多的是业务,写数据库之类的,所以,你网络单线程就可以了,剩下的就是你先把你瓶颈业务拆出线程池,线程间交互都是靠消息队列的方式,其实从客户端发来数据,到你给客户端回包,整个业务流程还是一条线,并发的是你最耗时的操作去并发。

#2


别重复造*了,用libev,libevent,libuv,modo等开源库吧,他们底层封装的都很好, 求教面向大规模连接的高并发网络模型

#3


引用 2 楼 boyhailong 的回复:
别重复造*了,用libev,libevent,libuv,modo等开源库吧,他们底层封装的都很好, 求教面向大规模连接的高并发网络模型

我更多的是对技术的探索吧,不太像把开源库直接拿来用,不过能学习这样的优秀的开源库的设计思路也很不错