微前端架构如何改变企业的开发模式与效率提升
1026
2022-11-27
深入浅出RPC框架|青训营笔记
由于课程涉及到的RPC知识需要自己对其有较为全面的理解后才能比较好的get到课程中提及的各种框架设计的点,因此我建议阅读Kitex框架的源码,再结合课程目录去体会Kitex设计的初衷,笔记就以罗列概况为主,以备后续对比查阅。
基本概念
需要解决的问题
函数映射数据转换成字节流网络传输
RPC的好处
单一职责,有利于分工协作和运维开发可扩展性强故障隔离,服务整体更可靠
使用RPC的问题
服务宕机,对方如何处理?调用时发生网络异常,如何保证消息的可达性?请求量突增导致服务无法及时处理,有哪些应对措施?
分层设计
编解码层
语言特定的格式:一些语言内建了将内存对象编码为字节序列的支持,如java的java.io.Serializable文本格式:JSON、XML、CSV,具有可读性二进制编码:具有跨语言,高性能优点,如Thrift的BinaryProtocol、Protobuf等
协议层
特殊结束符:一个特殊字符作为每个协议单元结束标志
变长协议:定长加不定长的部分组成,其中定长的部分需要描述不定长内容长度
网络通信层
关键指标
稳定性&易用性&扩展性
熔断:保护调用方,防止被调用的服务出现问题而影响整个链路限流:保护被调用方,防止大流量把服务压垮超时控制:避免浪费资源在不可用的节点上请求成功率
负载均衡重试
长尾请求
网络抖动GCBackup Request(解决方式)
注册中间件:以上的功能都通过注册中间件的方式启用
观测性
Log(日志)、Metric(监控)、Tracing(追踪)内置观测性服务
高性能
高吞吐低延迟手段:
连接池多路复用高性能编解码协议高性能网络库
企业实践
Kitex是字节跳动内部的Golang微服务RPC框架,先已开源。
Kitex文档:cloudwego.io/zh/docs/kit…
Kitex体验:juejin-/post/709896…
Kitex源码阅读—脚手架代码的生成(一):juejin-/post/710086…
整体架构
自研网络库
原生网络库的问题
原生库无法感知连接状态
在使用连接池时,池中存在失效的连接,影响连接池的复用。
原生库存在goroutine暴涨的风险
一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能。
自研网络库 — Netpoll
解决无法感知连接状态
引入epoll主动监听机制,感知连接状态
解决goroutine暴涨的风险
建立goroutine池,复用goroutine
提升性能
引入Nocopy Buffer,向上层提供NoCopy 的调用接口,编解码层面零拷贝
扩展性设计
支持多协议,也支持灵活的自定义协议扩展
性能优化
网络库优化
调度优化
epoll_wait在调度上的控制gopool重用goroutine,降低同时运行携程数
LinkBuffer
读写并行无锁,支持nocopy地流式读写高效扩缩容Nocopy Buffer池化,减少GC
Pool
引入内存池和对象池,减少GC开销
编解码优化
Codegen
预计算并分配内存,减少内存操作次数,包括内存分配和拷贝inline减少函数调用次数和避免不必要的反射操作自研了Go语言实现的Thrift IDL解析和代码生成器,支持完善的Thrift IDL语法和语义检查,并支持了插件机制 — Thriftgo
JIT
使用JIT编译技术改善用户体验的同时带来更强的编解码性能,减轻用户维护生成代码的负担基于JIT编译技术的高性能动态Thrift 编解码器 — Frugal
合并部署
微服务过于微小,传输和序列化开销越来越大将亲和性强的服务实例尽可能调度到同一个物理机,远程RPC调用优化为本地IPC调用
小结
由于课程关于RPC框架的理解需要结合具体的使用经验,因此我推荐尝试开始独立阅读Kitex的源码,可以从边缘组件开始,如:分析是如何通过命令行创建脚手架代码的,等逐渐熟悉源码分析的方法之后,可以尝试阅读核心组件的源码,再结合课程的组织目录,仔细体会Kitex的设计。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~