申请试用
HOT
登录
注册
 
go-Chassis 在 shopee 供应链的实践
0 点赞
0 收藏
0下载
无厘头
/
发布于
/
340
人观看

我们用 Go 做了

  • GRPC / HTTP 服务
  • 业务 API GateWay
  • 异步/定时任务
  • 异构数据平台
  • ID 生成服务
  • 多级缓存
展开查看详情

1.go-Chassis 在 Shopee 供应链的实践 余卓煌

2.关于 Shopee • 东南亚本地电商平台 • 成立于 2015 • 8个市场 • 发展非常快

3.Shopee 供应链过去的技术栈

4.Shopee 供应链现在的技术栈

5.Why Go • 运行和开发效率的平衡 • 简洁易上手 • 显式严谨的风格

6.我们用 Go 做了 • GRPC / HTTP 服务 • 业务 API GateWay • 异步/定时任务 • 异构数据平台 • ID 生成服务 • 多级缓存

7.我们的实践 1. 业务框架 2. 服务治理 3. 监控及全链路跟踪 4. 日志

8.统一业务框架 • 长期好处 • 标准化技术规范 • 打破技术壁垒 • 技术沉淀 • 当前切实的好处 • 统一的服务治理规范 • 统一的监控规范 • 全链路跟踪 • 服务注册/服务发现

9.Shopee 原有的服务注册/发现 • ZK + nginx • 扩展性差 • 没有客户端负载均衡 • 无定制和服务治理支持

10.go-Chassis • 多协议支持 • 可扩展 • 服务治理的支持 • Sidecar 支持

11.go-Chassis + service-center

12.二次开发 • 我们要的是部门内的业务框架,不同于通用的框架 • 定制自己的标准,成为框架的默认行为 • 减少一些灵活度,禁用不给用的操作 • 制定自己的版本路线 • 识别自己的需求,明确自己的用例 • 区分自己的轻重缓急 • 测试用例管理 • 只依赖 go test 不去管理,测试用例会陷入混乱 • 代码覆盖率不能说明需求覆盖率 • 我们从需求覆盖的角度去管理测试用例

13.当前架构

14.我们的实践 1. 业务框架 2. 服务治理 3. 监控及全链路跟踪 4. 日志

15.配置热更新 • go-archaius • 热更新支持 • 支持多配置源 • 支持自定义配置源

16.Apollo

17.go-archaius + Apollo • 将 apollo 作为 archaius 一个配置源接入 • 一些细腻点 • 热更新要以模块单位 • 配置缓存的更新 回调前vs回调后

18.我们的实践 1. 业务框架 2. 服务治理 3. 监控及全链路跟踪 4. 日志

19.CAT • 美团开源的实时应用监控平台 • 效率高成本低 • 对比 opentracing • opentracing:Trace + Span • CAT: 消息树 + Transation(transaction没有ID)

20.go-Chassis + CAT • 定时统计性能指标 • 容器 CPU/Mem/Net 等信息上报 • golang runtime 信息收集 • 所有的服务调用 • 实现 go-chassis 中间件 CatHandler 劫持上报服务调用 • 利用 context 来携带调用链信息 • 全链路跟踪 在客户端调用时生成消息树id,以HTTP Header 传递给服务端

21.不能实现的Context

22.全链路跟踪

23.100万/秒 的上报 • 异步批量上报 • 上报上下文导致频繁的内存分配:sync.Pool • 序列化的问题 • encodeX() string 还是 encodeX([]byte) []byte • []byte 的 grow • []byte 本身用 sync.Pool 分配 • Sprintf/Fprintf => append • 3000ns => 500ns

24.我们的实践 1. 业务框架 2. 服务治理 3. 监控及全链路跟踪 4. 日志

25.100万/秒的日志API • 异步 • fmt.Sprintf 很慢 - 换一套API • 取文件行号也很慢 - 利用 RetAddr 做缓存 • 时间转字符串也有开销 - 缓存到秒

26.刻骨铭心的坑 • sync.Pool + Slice 与 内存泄漏

27.刻骨铭心的坑 • 意外的写入成功

28.刻骨铭心的坑 • 发生了什么 • If the context is canceled by the user the sql package will call Tx.Rollback before discarding and closing the connection. • Conn is a connection to a database. It is not used concurrently by multiple goroutines. • 这个问题 go 1.12/1.13/1.14 一直都有

29.收获 • 在刚刚过去的双十一中,我们没有事故

0 点赞
0 收藏
0下载