gev 标签

[ gev ] Go 语言优雅处理 TCP “粘包” 有更新!

https://github.com/Allenxuxu/gev

gev 是一个轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库,支持自定义协议,轻松快速搭建高性能服务器。

最近对 gev 进行了一次较大改动,主要是为了能够以插件的形式支持各种自定义的数据协议,让使用者可以便捷处理 TCP 粘包问题,专注于业务逻辑。

做法如下,定义一个接口 Protocol

// Protocol 自定义协议编解码接口
type Protocol interface {
	UnPacket(c *Connection, buffer *ringbuffer.RingBuffer) (interface{}, []byte)
	Packet(c *Connection, data []byte) []byte
}

用户只需实现这个接口,并注册到 server 中,当客户端数据到来时,gev 会首先调用 UnPacket 方法,如果缓冲区中的数据足够组成一帧,则将数据解包,并返回真正的用户数据,然后在回调 OnMessage 函数并将数据通过参数传递。

下面,我们实现一个简单的自定义协议插件,来启动一个 Server :

| 数据长度 n |  payload |
|  4字节    |  n 字节   |
阅读全文 »

Go 网络库并发吞吐量测试 置顶!

https://github.com/Allenxuxu/gev

本文主要测试 gev 网络库和其他三方 Go 网络库以及标准库的吞吐量对比。

测试对象

  • gev :一个轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
  • eviop :evio 的优化版本
  • evio :Fast event-loop networking for Go
  • gnet :eviop 的网络模型替换版本
  • net 标准库

测试方法

采用陈硕测试 muduo 使用的 ping pong 协议来测试吞吐量。

简单地说,ping pong 协议是客户端和服务器都实现 echo 协议。当 TCP 连接建立时,客户端向服务器发送一些数据,服务器会 echo 回这些数据,然后客户端再 echo 回服务器。这些数据就会像乒乓球一样在客户端和服务器之间来回传送,直到有一方断开连接为止。这是用来测试吞吐量的常用办法。

测试的客户端代码: https://github.com/Allenxuxu/gev/blob/master/benchmarks/client/main.go

测试脚本:https://github.com/Allenxuxu/gev/blob/master/benchmarks/bench-pingpong.sh

主要做两项测试:

  • 单线程单个 work 协程测试,测试并发连接数为 10/100/1000/10000 时的吞吐量
  • 4线程4个 work 协程测试,测试并发连接数为 10/100/1000/10000 时的吞吐量

所有测试中,ping pong 消息的大小均为 4096 bytes,客户端始终是4线程运行。

测试结果

gev11.png

gev44.png

阅读全文 »

开源 gev: Go 实现基于 Reactor 模式的非阻塞 TCP 网络库 置顶! 有更新!

gev 轻量、快速的 Golang 网络库

gev 是一个轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库,底层并不使用 golang net 库,而是使用 epoll 和 kqueue,因此它并不支持 Windows。

为什么有 gev

Golang 的 goroutine 虽然非常轻量,但是每启动一个 goroutine 仍需要 4k 左右的内存。读了鸟窝大佬的文章【百万 Go TCP 连接的思考: epoll方式减少资源占用】后,便去研究了了下 evio

evio 虽然非常快,但是仍然存在一些问题,便尝试去优化它,于是有了 eviop 项目。关于 evio 的问题可以看我的另一篇博文 【Golang 网络库evio一些问题/bug和思考】。在优化 evio 完成 eviop 的过程中,因为其网络模型的缘故,愈加感觉修改它非常麻烦,成本比重新搞一个还高。

最终决定自己重搞一个,更加轻量,不需要的全去掉。加上大学时学习过 muduo ,便参考 muduo 的使用的 Reactor 模型实现 gev 。

在 linux 环境下,gev 底层使用 epoll ,这是 gev 会专注优化的地方。在 mac 下底层使用 kqueue,可能不会过多关注这部分的优化,毕竟很少有用 mac 做服务器的(Windows 环境"暂"不支持)。

特点

  • 基于 epoll 和 kqueue 实现的高性能事件循环
  • 支持多核多线程
  • 动态扩容 Ring Buffer 实现的读写缓冲区
  • 异步读写
  • SO_REUSEPORT 端口重用支持
阅读全文 »