Go 语言RPC之Kitex设计| 青训营笔记

278 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第11天

本文为青训营课程笔记,配合原课程食用效果更佳哦~

课程笔记

RPC之Kitex设计

整体架构 - Kitex

  • **Kitex Core:**核心组件
  • Kitex Byted:与公司内部基础设施集成
  • Kitex Tool:代码生成工具

自研网络库

  • 背景
    • 原生库无法感知连接状态

      • 在使用连接池时,池中存在失效连接,影响连接池的复用。
    • 原生库存在 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 编解码器

合并部署

  • 微服务过微,传输和序列化开销越来越大

  • 将亲和性强的服务实例尽可能调度到同一个物理机,远程 RPC 调用优化为本地 IPC 调用

  • 中心化的部署调度和流量控制

  • 基于共享内存的通信协议

  • 定制化的服务发现和连接池实现

  • 定制化的服务启动和监听逻辑

小结

  1. 介绍了 Kitex 的整体架构

  2. 介绍了自研网络库 Netpoll 的背景和优势

  3. 从扩展性和性能优化两个方面分享了相关实践

  4. 介绍了内部正在尝试落地的新的微服务形态:合并部署

总结收获

通过样例与知识点结合的方式,学到了一些Kitex设计的知识;

通过样例的讲解,更了解了具体的Kitex设计方法;

又是收获满满的一天

引用参考

青训营官方课程视频

青训营官方课程文档

青训营官方课程笔记