一个简单的rpc
之前写了一个rpc框架,由于是第一次写,所以当时想把限流,熔断,服务注册与发现等功能都加进去,当时并没有太关注性能,而且代码很多很乱
所以新写一个minirpc,此项目不会有太多的功能,只有最基础的功能,参考 go-kratos 可以知道,我们完全可以基于一个简单的rpc框架扩展成一个很好用的框架
既然此框架注重性能,那么要做好压测,至于怎么做压测,可以看我之前写的文章:压测
至于此项目如何做压测,我们直接fork鸟窝老师的压测仓库,模仿他的代码,为自己的rpc框架增加上压测代码
我们基于tcp协议,可以很简单的实现一个支持长连接的rpc。
- 尽可能的使用对象池,减少内存分配,垃圾回收压力
- 除了对象,还有[]byte缓冲区
- 可以参考
fasthttp
,此框架就是把对象复用做到极致了,性能才能那么好
- 使用goroutine pool,有挺多线程的库,复用goroutine
- 使用bufio,虽然会增加内存的使用,但是大部分情况下会减少系统调用,弊大于利
- 考虑场景: 长连接 or 短链接 or 连接多路复用。针对场景做特殊优化
- 比如说两个微服务之间调用,可能只需要建立少数的长连接就够用了,即便该服务被好几百个服务调用,几千条连接也够用了
- 如果是网关等需要建立大量长连接的场景,而且大部分都是空闲连接的话,std net就不合适了,可以使用
netpoll
代替std net
- pprof
- go tool pprof --alloc_objects your-program mem.pprof
- 可以但没必要
- 其实还可以将数据压缩后传送,然后再解压,消耗更多的cpu但是传输更快了
最好了优化以后,每个rpc其实性能都差不多,因为基本都是使用的std net。如果需要极致优化,需要从网络库方面入手了。 当然实际使用中还需要考虑负载均衡等策略。
选择rpc的时候,性能就显得没那么重要了,毕竟也没听说过换了rpc以后,因为性能提升带来非常大的收益。 就像正常选择第三方库一样,框架提供的功能,更新频率,修复bug的速度啥的才更需要考虑。