CloudWeGo-Netpoll
简介
[Netpoll][Netpoll]是一个高性能的非阻塞I/O网络框架,专注于RPC场景,由[字节跳动][ByteDance]开发。
RPC通常在处理逻辑上较为繁重,因此无法串行处理I/O。但是Go的标准库[net][net]设计为阻塞I/O API,所以RPC框架只能遵循一个连接一个goroutine的设计。在高并发下,由于大量goroutine的存在,这将浪费大量的上下文切换成本。此外,[net.Conn][net.Conn]没有检查连接是否存活的API,因此RPC框架难以实现高效的连接池,因为池中可能存在大量失效连接。
另一方面,开源社区目前缺乏专注于RPC场景的Go网络库。类似的项目如:[evio][evio]、[gnet][gnet]等,都主要关注[Redis][Redis]、[HAProxy][HAProxy]等场景。
现在,[Netpoll][Netpoll]应运而生,解决了上述问题。它借鉴了[evio][evio]和[netty][netty]的设计,具有出色的性能,更适合微服务架构。此外,[Netpoll][Netpoll]提供了许多特性,建议在某些RPC场景中替代[net][net]使用。
我们基于[Netpoll][Netpoll]开发了RPC框架[Kitex][Kitex]和HTTP框架[Hertz][Hertz],两者都具有业界领先的性能。
[示例][netpoll-examples]展示了如何使用[Netpoll][Netpoll]构建RPC客户端和服务器。
更多信息请参考文档。
特性
-
已实现
- [LinkBuffer][LinkBuffer]为流式读写提供零拷贝API
- [gopool][gopool]提供高性能goroutine池
- [mcache][mcache]提供高效的内存复用
IsActive
支持检查连接是否存活Dialer
支持构建客户端EventLoop
支持构建服务器- TCP、Unix Domain Socket
- Linux、macOS(操作系统)
-
未来计划
- [io_uring][io_uring]
- 共享内存IPC
- TLS
- UDP
-
不支持
- Windows(操作系统)
性能
基准测试应满足工业使用要求。在RPC场景中,并发和超时是必要的支持项。
我们提供了[netpoll-benchmark][netpoll-benchmark]项目,用于跟踪和比较[Netpoll][Netpoll]与其他框架在不同条件下的性能,以供参考。
更多基准测试请参考[kitex-benchmark][kitex-benchmark]和[hertz-benchmark][hertz-benchmark]。