高性能和轻量级网络库 gnet

MIT
Google Go SHELL
跨平台
2019-09-16
潘少online

gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:libuv 和 libevent

这个项目存在的价值是提供一个在网络包处理方面能和 RedisHaproxy 这两个项目具有相近性能的Go 语言网络服务器框架。

gnet 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的网络库。gnet 是衍生自另一个项目:evio,但是性能更好。

功能

  • 高性能 的基于多线程模型的 Event-Loop 事件驱动
  • 内置 Round-Robin 轮询负载均衡算法
  • 简洁的 APIs
  • 基于 Ring-Buffer 的高效内存利用
  • 支持多种网络协议:TCP、UDP、Unix Sockets
  • 支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD 里的 kqueue
  • 支持异步写操作
  • 允许多个网络监听地址绑定在一个 Event-Loop上
  • 灵活的事件定时器
  • SO_REUSEPORT 端口重用

I/O 事件

gnet 目前支持的 I/O 事件如下:

  • OnInitComplete 当 server 初始化完成之后调用。
  • OnOpened 当连接被打开的时候调用。
  • OnClosed 当连接被关闭的时候调用。
  • OnDetached 当主动摘除连接的时候的调用。
  • React 当 server 端接收到从 client 端发送来的数据的时候调用。(你的核心业务代码一般是写在这个方法里)
  • Tick 服务器启动的时候会调用一次,之后就以给定的时间间隔定时调用一次,是一个定时器方法。
  • PreWrite 预先写数据方法,在 server 端写数据回 client 端之前调用。

核心设计

多线程模型

gnet 重新设计开发了一个新内置的多线程模型:『主从 Reactor 多线程』,这也是 netty 默认的线程模型,下面是这个模型的原理图:

 

它的运行流程如下面的时序图:

通信机制

gnet 的『主从 Reactors 多线程』模型是基于 Golang 里的 goroutines的,所以 gnet 里必须要有一个能在 goroutines 之间进行高效率的通信的机制,我没有选择 Golang 里的主流方案:基于 channel 的 CSP 方案而是选择了性能更好的、基于 ring-buffer 的 disruptor 方案。

最终选择了 go-disruptor:高性能消息分发队列 LMAX Disruptor 的 Golang 实现。

自动扩容的 Ring-Buffer

gnet 利用 ring-buffer 来缓存 TCP 流数据以及管理内存使用。

的码云指数为
超过 的项目
加载中

评论(8)

Eriloan
Eriloan
得需要生态的支撑。
cevin
cevin
yywww
yywww
相当于一个go版本的netty嘛
oscyj
oscyj
连接池的方案在高性能的场合还是需要的,这个异步也一样,应用场合不同,一般用golang的标准库就不错了,但是连接真的是以百万计数的时候,异步的优势还是大的
dwingo
dwingo
纠结如此高的性能,那还何苦用Go呢. 百万计链接通常的做法是用C/C++写个高性能前端汇总成一个连接给后端处理,后端就无所谓用什么语言了,用什么网络接口都差不多了.
sunday12345
sunday12345
golang 使了好大的劲,把程序员从异步的逻辑链中解放了出来,这帮子人又一头扎进去了!
z
zb1491449720374
无解决方案 , 地球上有这么多人

暂无资讯

暂无问答

【开源】开源一个轻量级且高性能的 Go 网络框架 gnet

gnet 是一个基于事件驱动的高性能和轻量级网络框架。它直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:netty 和 libuv。...

10/08 22:21
12
0
fornøyd pick for Kjøp Beats by dre tidligere

Nevermind vissheten om det, veldig godt, består alle mennesker av et hodesett. Jeg er sikker på at du kan rutinemessig avansement. Produserer ingen feilberegning, denne geste...

2015/01/13 16:41
5
0
Greenplum5.9安装笔记

Greenplum集群机器配置(本教程没有主节点的备份节点) Liunx修改主机名教程:https://www.cnblogs.com/gudi/p/7846978.html 服务器统一配置:4核16G,系统盘100GSSD,数据盘300G(注意:一定要将数...

06/18 10:03
11
0
Slackware安装包全系列说明

在安装包的选择上Slackware比较精心,不往里面人为加入许多不必要的东西(对比RH一堆的edhat-XXX.rpm),尽可能的保持原有的味道。所以在操纵Slackware的时候能够体会到更多的系统运行机制。下...

2014/01/12 13:17
152
0
Slackware安装包全系列说明

以下是slackware默认的主要tagfile集,加上我自己的一些简短翻译,希望对大家有点帮助,有误之处请指正,版本是10,这里不包括gnome和kde。 -------------------------------------------- t...

2011/12/16 10:09
957
0

没有更多内容

加载失败,请刷新页面

没有更多内容

返回顶部
顶部