这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
RPC 需要解决的问题
- 函数映射
- 数据转换成字节流(可以跨语言)
- 网络传输
好处:
- 利于分工合作
- 扩展性强
- 故障隔离 问题:
- 服务宕机如何处理
- 网络异常如何保证消息可达
- 请求量突增无法及时处理,如何应对
分层设计
- 编解码层
- 协议层
- 网络层
掌握:选层的关键是什么,以及这一层的核心架构是怎样的。
稳定性
- 熔断:保护调用方
- 限流:保护被调用方
- 超时控制:避免浪费资源在不可用节点上
请求成功率
- 负载均衡
- 重试
长尾请求
比如请求时间排序,99%的位置,剩下的 1%就是长尾请求 如果请求超过这个长尾时间 t3 就直接重试
注册中间件
通过中间件增加稳定性 how?
- 负载均衡、熔断等都是中间件实现的
高性能
目标
- 高吞吐
- 低延迟
场景
- 单机多机
- 单连接,多连接
- 单/多 Client, 单/多 Server
- 不同请求包大小
- 不同请求类型
手段
- 连接池
- 多路复用
- 高性能解码协议
- 高性能网络库
实践
自研网络库背景
- 原生库无法感知链接池状态(池中存在失效连接,影响复用效果)
- 原生库存在 goroutine 暴涨风险
Netpoll
- 引入 epoll 监听,感知链接状态
- 建立 goroutine 池,复用 goroutine
- 引入 Nocopy buf,零拷贝
调度优化
epoll_wait 在调度上的控制 LinkBuffer:并写无锁读写, nocpoy 流式输出
合并部署
微服务过微,传输和序列化开销大 亲和性强的服务实例,调度到同一个机器,远程 RPC 变成本地 IPC 调用