爱上开源之网络通信库boot4go-fastnet,简单而不乏高能

爱上开源之网络通信库boot4go-fastnet,简单而不乏高能_第1张图片

准备在物联网中间件这块做一些创新的产品, 故先提前准备了剥离出以后自己御用的底层tcp通讯的网络库boot4go-fastnet。

boot4go-fastnet项目简单,主要代码大小不足20K,但是性能不输其他的网络库。 boot4go-fastnet对网络通讯的优化思想的灵感主要是来自于另一个高性能的http服务fasthttp。 只是fasthttp仅仅只是提供了http的通信实现,并没有在tcp层次上进行实现,在做中间件的过程中,很多的服务都是通过tcp或者端口通信实现的,所以必须要有一个tcp的通讯底层的网络库,对比了网上相对来说比较有名的epoll,gnet,go-netty等项目,其中epoll,gnet都是类似于redis的多路复用的实现方式,在网络通信的方式上,采取了nio的方式来实现,在看etcd等代码的时候,都没有看到其使用类似的方式,其实go的协程方式,已经非常好的解决了以前bio的弊端,之所以有nio出现,主要是在以往的bio方式中,都有一个线程对于去处理监听得到的连接, 线程的维护开销较大,在大量的长连接的情况下,会导致系统的开销非常的吃紧,这才有了nio的模型,但是在go里,其中的协程对于大量多并发的情况处理,没有线程这样的重,在看看redis的io模型,redis的之所以性能优秀,多路复用是其我们都知道的,但是要知道首先redis是单线程处理,这样他的多路复用才真正的有意义,另外,redis的快,还有个关键点,就是内存复制这块,零拷贝机制,这也是一个非常的关键点,最后一点,redis是基于内存的操作,通过RDB和AOF结合方式,尽可能减小磁盘写对性能的影响,综合以上,才有了redis的高性能,所以如果一味的说nio就能有网络高性能,就是一叶障目,目光短浅了。  正是有这样的怀疑,所以还是先压数据测性能先, 自己就写了个简单的网络通信库,按照fasthttp的思想,进行以下的优化点实现

1. 引入协程池,将协程的开销进一步压缩

2. 内存复用, 缓存池,对象均使用对象池的实现,进一步减小内存分配和Gc的开销

3.  零拷贝,这里并不是真正的零拷贝,只是通过bytebuffer仅可能的减少不必要的内存拷贝。

看看fastnet和Epoll的PK结果。

两者都在我的机器上,在并发数2000的时候,数据意义比较大,超过2000的时候,会有一些jmeter的报错,数据失真,数据包使用的是不到1k的小包

直接上结果:

fastnet

爱上开源之网络通信库boot4go-fastnet,简单而不乏高能_第2张图片

爱上开源之网络通信库boot4go-fastnet,简单而不乏高能_第3张图片 

 

Epoll

爱上开源之网络通信库boot4go-fastnet,简单而不乏高能_第4张图片

 爱上开源之网络通信库boot4go-fastnet,简单而不乏高能_第5张图片

 

原生的golang的net库实现,比较差,并发2000的情况下,jmeter容易报错,1000的情况下,数据才有意义

2000的数据

爱上开源之网络通信库boot4go-fastnet,简单而不乏高能_第6张图片

 爱上开源之网络通信库boot4go-fastnet,简单而不乏高能_第7张图片

 1000的情况

爱上开源之网络通信库boot4go-fastnet,简单而不乏高能_第8张图片

 爱上开源之网络通信库boot4go-fastnet,简单而不乏高能_第9张图片

 

你可能感兴趣的:(爱上开源,golang,人工智能,redis,网络,java)