Go 开源说第十八期预告:基于 Reactor 模式开发网络服务——gnet
点击蓝字
关注我们
潘建锋
https://github.com/panjf2000
公司、职位:
腾讯游戏,后端高级工程师
嘉宾简介:
Go 协程池 ants 和高性能 Go 网络库 gnet 作者,Golang、redis、istio、fasthttp、gin 等知名开源项目的活跃贡献者,专注于系统底层原理、高性能网络编程、架构设计、云原生、分布式。
Go 语言基于 goroutine 和 GPM 调度器构建了一个简洁而优秀的原生网络模型,让开发者能够用同步的模式去编写异步的逻辑:goroutine-per-connection 模式,极大地降低了开发者编写网络应用时的心智负担,而且借助于 Go Scheduler 对 goroutines 的高效调度,这个原生网络模型足以应对绝大部分的应用场景。
基于同步编程模式的原生 Go 网络库能够满足大部分网络后台系统的开发,且可以有良好的性能。但是,对于某些追求极致性能的场景,如海量连接,原生库会引入庞大的 goroutines 数量,消耗大量的资源,从而影响性能表现,Go 原生网络库在这一类场景下会变得力不从心,在不考虑更换编程语言的前提下,基于 Reactor 模式开发网络服务是主流的解决方案,gnet 正是为此而生。
核心亮点:
高性能:极高的网络通信性能、极低的系统资源损耗;轻量级:API 精简专注,不引入过度复杂且不实用的特性,保证框架的易用性。
功能特性:
高性能 的基于多线程/Go程网络模型的 event-loop 事件驱动
内置 goroutine 池,由开源库 ants 提供支持
内置 bytes 内存池,由开源库 bytebufferpool 提供支持
整个生命周期是无锁的
简单易用的 APIs
高效、可重用而且自动伸缩的环形内存 buffer
支持多种网络协议/IPC 机制:TCP、UDP 和 Unix Domain Socket
支持多种负载均衡算法:Round-Robin(轮询)、Source-Addr-Hash(源地址哈希) 和 Least-Connections(最少连接数)
支持两种事件驱动机制:Linux 里的 epoll 以及 FreeBSD/DragonFly/Darwin 里的 kqueue
支持异步写操作
灵活的事件定时器
SO_REUSEPORT 端口重用
内置多种编解码器,支持对 TCP 数据流分包:LineBasedFrameCodec, DelimiterBasedFrameCodec, FixedLengthFrameCodec 和 LengthFieldBasedFrameCodec,参考自 netty codec,而且支持自定制编解码器
实现 gnet 客户端(测试中)
发展状况:
目前 gnet 是性能最高的第三方 Go 语言开源网络库,且应用广泛,目前已经在腾讯、腾讯游戏、爱奇艺、百度、小米等大型互联网公司的生产环境上部署运行,经过大厂们的线上流量考验,gnet 在稳定性方面是有保障的,可以放心试用。
GMP 调度器精要
讲解 Go 的 GMP 调度器的基本运行原理,使读者对 Go 语言的并发调度有一个整体且较为准确的理解。
Go 网络并发模型
进一步讲解 Go 语言的网络并发模型,理解基于 Go 构建的网络服务在底层是如何运转的。
优化 Go 网络开发
讲解 gnet 是如何直接基于多路复用技术提升网络通信性能的,以及 gnet 在 Go 原生网络库之外的定位的目标。