- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
go-Chassis 在 shopee 供应链的实践
我们用 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 .收获 • 在刚刚过去的双十一中,我们没有事故