【golang】高并发下TCP常见问题解决方案

Python011

【golang】高并发下TCP常见问题解决方案,第1张

首先,看一下TCP握手简单描绘过程:

其握手过程原理,就不必说了,有很多详细文章进行叙述,本文只关注研究重点。

在第三次握手过程中,如果服务器收到ACK,就会与客户端建立连接,此时内核会把连接从半连接队列移除,然后创建新的连接,并将其添加到全连接队列,等待进程调用。

如果服务器繁忙,来不及调用连接导致全连接队列溢出,服务器就会放弃当前握手连接,发送RST给客户端,即connection reset by peer。

在linux平台上,客户端在进行高并发TCP连接处理时,最高并发数量都要受系统对用户单一进程同时打开文件数量的限制(这是因为系统每个TCP都是SOCKET句柄,每个soker句柄都是一个文件),当打开连接超过限制,就会出现too many open files。

使用下指令查看最大句柄数量:

增加句柄解决方案

安装:

go get -v -u github.com/rocket049/connpool

go get -v -u gitee.com/rocket049/connpool

rocket049/connpool 包是本人用go语言开发的,提供一个通用的TCP连接池,初始化参数包括最高连接数、超时秒数、连接函数,放回连接池的连接被重新取出时,如果已经超时,将会自动重新连接;如果没有超时,连接将被复用。

可调用的函数:

调用示例:

最近工作中遇到了 golang 的项目,稍稍对其产生了点兴趣,打算认真学习下,正巧在搭建 mysql 主备环境的时候发现如果用一个代理程序的话自己测试会方便很多(主要还是为了造轮子),于是这个基于golang的 tcp proxy 项目就产生了

结构图如下:

最常见的负载均衡模式,但有几个点需要支持:

github: EasyProxy

欢迎交流~

在这个工程第一版结束后,较为深入的学习了 slice , map , channel , struct , interface 等结构,还玩了下golang的 协程 , 反射 , 多态 等特性,顺带掌握了下其工程化应当注意的 包循环引入 , debug , 打包发布 等问题

总之现在对golang的熟悉程度就不像看书那么虚了~

如还有其他问题,欢迎喜欢 golang 的小伙伴联系我: xsank#foxmmail.com