goev - 一款基于 Go 语言的高性能、轻量级、非阻塞、I/O 事件驱动的网络框架

大家好,又见面了,我是 GitHub 精选君!

背景介绍

在进行 Go 语言的 TCP 网络编程时,我们通常使用标准库(go net),但是标准库的协程压力较大,因此我们需要一种更轻量级、高性能的非阻塞 I/O 事件驱动网络框架。goev 就是为此而生的。

用一句话介绍 goev 项目就是:“goev is a lightweight, concise i/o event demultiplexer implementation in Go”。

项目介绍

goev 是一款基于 Go 语言的高性能、轻量级、非阻塞、I/O 事件驱动的网络框架。它从 ACE 的设计模式中汲取灵感,为 TCP网络编程项目提供了优雅而简洁的解决方案。使用 goev,您可以无缝集成您的项目,而不必担心标准库(go net)引入的协程压力。与 go net 库相比,goev 可以在同步 I/O 方面至少提高20%的性能。此外,与框架内的无锁处理相结合,它提供了更好的优化机会,从而实现更高的整体性能增益。

以下是 goev 的工作原理:

goev的主要特点包括:

  • I/O事件驱动架构
  • 轻量级和简约的反应器模式实现,允许多个反应器的灵活组合
  • 面向对象的实现,更易于封装业务逻辑
  • 支持异步发送,允许高级应用程序执行同步I/O操作,同时异步处理业务处理
  • 轮询堆栈中的无锁操作,实现同步I/O的零拷贝数据传输
  • 完美支持REUSEPORT多轮询器模式
  • 内置四堆计时器实现,实现I/O和计时器事件的无锁/同步处理
  • 完全本地实现的接受器/连接器,提供最大的可定制性
  • 可控的底层线程数。每个连接每个协程的方法通常会导致线程数激增,但使用轮询器可以保持一致的线程数,将其保持在初始水平
  • 垃圾回收(GC)友好,最小化运行时的额外堆内存使用
  • 支持应用层与轮询器之间的交互,例如在轮询器协程中创建缓存,实现无锁使用(类似于runtime.mcache)
  • API较少,学习成本低

以下是对 goev 的性能测试数据,在阿里云 32 核 64G 的机器上,测试得到 160 万/秒的处理速率。

如何使用

您可以通过以下步骤安装goev:

go get github.com/shaovie/goev

如果您需要使用goev,可以参考如下示例代码,更多详细的代码可以在 GitHub 中查看。

简单的服务示例:

package main

import (
    "github.com/shaovie/goev"
)

var connReactor *goev.Reactor

type Conn struct {
	goev.IOHandle
}

func (c *Conn) OnOpen() bool {
	if err := connReactor.AddEvHandler(c, c.Fd(), goev.EvIn); err != nil {
		return false
	}
	return true
}
func (c *Conn) OnRead() bool {
	buf, n, _ := c.Read()
	if n == 0 { // Abnormal connection
		return false
	}
    // parse msg
    return true
}
func (c *Conn) OnClose() {
    c.Destroc(h) // release resource
}

func main() {
	runtime.GOMAXPROCS(runtime.NumCPU()*2 - 1)
	listenReactor, err := goev.NewReactor(goev.EvPollNum(1))
	if err != nil {
		panic(err.Error())
	}
	connReactor, err := goev.NewReactor(goev.EvPollNum(runtime.NumCPU()*3/2))
	if err != nil {
		panic(err.Error())
	}
	_, err = goev.NewAcceptor(listenReactor, ":8080", func() goev.EvHandler { return new(Conn) })
	if err != nil {
		panic(err.Error())
	}

	go func() {
		if err = listenReactor.Run(); err != nil {
			panic(err.Error())
		}
	}()
    
	if err = connReactor.Run(); err != nil {
		panic(err.Error())
	}
}
项目推介

根据测试,goev 在同步 I/O 方面的性能比 go net 库提高了至少 20%,这使得它成为一款非常值得推荐的网络框架。如果您正在寻找一款高性能、轻量级、非阻塞、I/O事件驱动的网络框架,那么 goev 绝对是您的不二选择。快来尝试一下吧!

以下是该项目 Star 趋势图(代表项目的活跃程度):

更多项目详情请查看如下链接。

开源项目地址:https://github.com/shaovie/goev

开源项目作者:shaovie

以下是参与项目建设的所有成员:

关注我们,一起探索有意思的开源项目。


更多精彩请扫码关注如下公众号。

Written on August 24, 2023