Golang轻量级TCP服务器框架(八)—— 创建消息队列、工作池、限定Gourtine数量
原作者视频地址:zinx-Golang轻量级TCP服务器框架 本人为自学整理的文档,梳理思考开发框架的基本思路,方法,以及视频中不理解的地方。 若想学习,强烈建议直接观看原作视频即可。 可在下方留言交流。
1.目的
这个东西是什么?
客户端与server链接时候,客户端发送过来消息: 原来:①StartReader()解析消息+go 消息处理 ----> ②StartWriter()回复客户端 现在:①StartReader()解析消息---->②采用工作池方式进行消息处理 ----> ③StartWriter()回复客户端
为什么要这样做?
如果按照我们之前的方式,每链接一个客户端,就会启动一个go Reader()和一个go Writer()。如果再有消息过来得话,还会开启go DoMsgHandler()。 如果此时,一下链接进来10W客户端。肯定会一下子启动20W个Reader()和Writer()协程。但是这两个函数都是阻塞式的发送和接受,阻塞的时候,并不会占用CPU。 但是,如果这10W个客户端集体发送很多个请求,若不对go DoMsgHandler()协程数量做控制的话,就会瞬间启动超多协程,击垮服务器。 我们添加,这个工作池的作用,就是为了使消息处理的Gourtine的数量变成可控的,从而可以调成出最佳性能。
2.思路
如图所示 开辟N个worker,再给每一个worker开辟自己的可缓冲的消息任务队列(channel) 当client的请求过来的时候,我们将数据封装成request之后,就放入其中的任一队列(或者随机放、或者取任务最少的通道放) 这样就使得DoMsgHandler所启动的协程是可控的,以便达到最佳性能
3.实现
源码,直接看最终zinx的github代码即可。 在这展示,不方便阅读。
|