• 他山之石,可以攻玉, 改造fasthttp实现高性能网络通信


    前言

    如果朋友看过在下上一篇文章《boot4go-gateway和nginx的性能测试大PK》,能在反向代理的性能PK中完胜Nginx的Gateway,是使用GO语言在基于比Go的标准http包快10倍以上的Fasthttp的基础上开发的;Fasthttp在Go语言里,以其卓著的性能优势而闻名,为什么fasthttp能有如此卓越的性能优势了,网上可以找到很多此方面的文章介绍。

    简要而言:

    一、是对每个连接请求和连接处理的协程进行了池化的处理;

    二、是通过合理的对象池的处理进可能的对性能进行压缩;

    三、尽量减少多余的内存拷贝。

    FastNet

    Fasthttp的处理http连接请求上的通过以上三种主要的优化方式,实现了高于Go标准Http包10倍以上的性能;可惜之处就是仅仅只支持了http层的第7层应用协议;如果能有一些做到了基于TCP协议之上的会话层的协议的处理包,那就可以基于这个包进行网络通信的开发,去实现自己的会话协议的各种客户端/服务端的通信程序,同时还具有和fasthttp同样高的网络通信能力,例如: 在我们开发的一款MQTT服务器中间件的产品中,我们就需要实现自己的服务器来支持其他传感器或者物联网终端通过mqtt发送过来的Mqtt协议消息;我们就是在fastnet的基础上,根据Mqtt3.1/3.1.1/5.0的协议规范来实现的,在实现的过程中,不需要考虑低层的通信过程的处理;完全把所有的实现都关注在Mqtt的三个版本的协议帧的处理和标准业务处理上;这个就是fastnet能够给我们带来的优势。

    GO语言其他Net库

    在构思和立项Fastnet这个项目之初,我们还是希望能够找到Go语言里比较的一些开源项目去进行改造来达到类似的效果;并对Go语言里有关网络通信的开源项目进行了一定的研究;

    其中以两种类型为多:

    一:以epoll、gnet为代表的,通过实现epoll方式来实现Nio通信的网络通信库;通过epoll的方式来优化网络通信的性能和效率

    二:以go-netty为代表的,通过实现netty的bootstrap/group/channel/eventLoop/eventHandler对象模式这样偏重于模仿netty的设计模式来实现通信库,目的主要是简易化网络通信的应用实现。

    这两类方法,

    前一类都是借鉴了redis和java实现的netty的nio的实现模式;可能是对网络底层的知识没太多掌握,实在是对epoll的一些代码没有读懂;主要是里面有一些使用了goc的方式,对这块的汇编代码实在不懂,加上时间也不太充分,所以就没有更细致的开了,加之对etcd的网络通信这块的代码研究的时候,发现其也没有使用epoll的处理方式,而是直接使用的net库进行改造的;所以就果断的放弃了epoll这样的实现方式。毕竟Hold不住,而且也有知名项目使用了非epoll方式;

    对于第二类主要是通过模拟java中netty的对象设计模式,优化的是开发的效率,但是由于设计模式方面的考虑,实现中会使用一些反射和冗余多余的类(设计模式的通病)。这样的方式性能都是由较大的考验的,特别是反射,在java中,由于java主要是做业务类项目,相对于CRUD这样的业务操作比较起来,反射的这点影响完全被忽略了,但是对于Go开发的底层服务来说,反射和底层通信调用的代码执行效率差的都是几个两级的差距,在大并发量的情况下,将会把这个差距放大非常大;所以对于这个go-netty项目而言,我们更多的考虑是借鉴这里的对象模型,然后实现常用的Decoder/Encoder, 尽量做工具型API级别的封装。

    最终的Fastnet实现方式

    Fastnet在这些网络通信库的研究基础上,综合各自的优点,最终的方案决定采用fasthttp的实现方式。

    一、在对连接接入和通信的Input/Ouput处理上使用协程池来对协程资源进行优化。

    二、尽可能的使用对象池的方式对回收较频繁的进行池化处理

    三、尽可能的减少内存复制

    四、提供业务的常用的Decoder和Encoder的工具包封装。

    结束语

    正所谓的“他山之石,可以攻玉”,通过借用Fasthttp的实现高性能http通信的方式方法;fastnet也实现了非常好的性能的网络通信,

    fastnet的项目地址

    github.com/gohutool/boot4go-fastnet

    欢迎大家下载使用

    在以后的文章中,我们会分享最后的fastnet和epoll的性能PK;

  • 相关阅读:
    不要升级!不要升级!MacOS 14.4 引发Java 应用崩溃
    [C]嵌入式中变量存储方案
    【Go语言入门学习笔记】Part6.包和两个几乎用不到的小Tip
    ♥Redis教程 - Redis知识体系详解♥
    【C++初阶】内存管理 && 初识模板
    mysql入门,各种概念了解
    数据处理的那些事「GitHub 热点速览」
    笔记 | 嵌入式系统概论
    C++代码基本内存操作及原理
    Android系统升级A/B分区OTA升级应用层调用UpdateEngine代码
  • 原文地址:https://blog.csdn.net/inthirties/article/details/126912697