RPC is usually heavy on processing logic and therefore cannot handle I/O serially. But Go’s standard library net is designed for blocking I/O APIs, so that the RPC framework can only follow the One Conn One Goroutine design. It will waste a lot of cost for context switching, due to a large number of goroutines under high concurrency. Besides, net.Conn has no API to check Alive, so it is difficult to make an efficient connection pool for RPC framework, because there may be a large number of failed connections in the pool.
On the other hand, the open source community currently lacks Go network libraries that focus on RPC scenarios. Similar repositories such as: evio, gnet, etc., are all focus on scenarios like Redis, HAProxy.
But now, Netpoll was born and solved the above problems. It draws inspiration from the design of evio and netty, has excellent Performance, and is more suitable for microservice architecture. Also Netpoll provides a number of Features, and it is recommended to replace net in some RPC scenarios.
- LinkBuffer provides nocopy API for streaming reading and writing
- gopool provides high-performance goroutine pool
- mcache provides efficient memory reuse
IsActivesupports checking whether the connection is alive
Dialersupports building clients
EventLoopsupports building a server
- TCP, Unix Domain Socket
- Linux, macOS (operating system)
- Shared Memory IPC
- Windows (operating system)
Benchmark should meet the requirements of industrial use. In the RPC scenario, concurrency and timeout are necessary support items.
Was this page helpful?