上次的笔记当中我们知道了RPC框架的关键评判标准,现在我们要知道这个框架在企业当中的实际应用,以及具体适用的中间件名称。
整体架构
图解来自课程:
Kitex Core核心组件
core是主干逻辑,定义了框架的层次、接口以及默认实现。 client和server是对用户暴露的,clent/server option还有client/server初始化的配置都是由两个package中提供的。
Kitex Byted
这是公司内部基础设施集成。
Kitex Tool
这是代码生成工具。
自研网络库
背景
- 原生库无法感知连接状态:在使用连接池时,池中存在失效连接,影响连接池的复用。
- 原生库存在 goroutine 暴涨的风险:一个连接一个 goroutine 的模式,由于连接利用率低下,存在大量 goroutine 占用调度开销,影响性能。
Netpoll
- 解决无法获知连接状态问题:引入 epoll 主动监听机制,感知连接状态。
- 解决 goroutine 暴涨的风险:建立 goroutine 池,复用 goroutine。
- 提升性能:引入 Nocopy Buffer,向上层提供 NoCopy 的调用接口,编解码层面零拷贝。
扩展性设计
可以支持多协议,也要支持自定义的协议扩展。
性能优化
网络库优化
调度优化
epoll_wait 在调度上的控制:防止其中一个过度使用,而另外的不使用。 gopool 重用 goroutine 降低同时运行协程数
LinkBuffer
读写并行无锁,支持流式读写,加快读写效率 高效扩缩容,从而节省空间复杂度和内存消耗 池化,减少GC
Pool
引入内存池和对象池,减少 GC 开销
编解码优化
我找了一些资料:
合并部署
- 中心化的部署调度和流量控制
- 基于共享内存的通信协议
- 定制化的服务发现和连接池实现
- 定制化的服务启动和监听逻辑
即:把相近的服务放在同一台物理机上,把能放在客户端的服务放在客户端,减少服务端的压力。