Archsummit北京2016 《外卖的背后:饿了么基础构架从0到1的演进》 兰建刚

2020-03-01 359浏览

  • 1.外卖的背后-饿了么基础架 构从0到1的演进 兰建刚 饿了么 框架&⼯工具
  • 2.
  • 3.
  • 4.APIGateway CI/CD ServiceAPI Config Services Trace SOA Framework Log 介绍 ■ 2015年初组建框架&⼯工具团队 DAL Corvus Metrics ■ 从0到1的演进 - 话题太⼤大 DB Cache Alert ■ ⽅方向决定成败,细节关乎痛苦 ■ 讲点细节的东⻄西 DRC Job Python,Java,Go Message Container SD
  • 5.⼤大纲 ⼤大 纲 负载均衡 ⽆无损升级 基础组件设计 兰建刚
  • 6.负载均衡 负载均衡 最初的⽅方案 ■ F5 ■ HAProxy ■ 部署在客户端本地 ■ 不需要考虑HAProxy的⾼高可⽤用 ■ 流量不是问题 兰建刚
  • 7.负载均衡 负载均衡 遇到的问题 ■ 部署量变⼤大 ■ 痛点:扩容需要更改所有客户端的HAProxy配置, 维护客户列表超级复杂 ■ ■ 后果:运维拒绝再部署HAProxy 配置不统⼀一 ■ ⺫⽬目录不⼀一致,⽂文件格式不统⼀一 ■ 批量修改容易出问题 ■ 案例:DAL采⽤用N+1的容灾策略,由HAProxy控制 切换,完成⼀一次切换演练需要1⼩小时+ 兰建刚
  • 8.负载均衡 负载均衡 探索解决之道 ■ ■ ⽅方案⼀一:减⼩小部署量 ■ 集中式的HAProxy ■ F5 ■ OSPF + LVS ⽅方案⼆二:减少运维成本 ■ 服务发现 - 只需要配置服务名和集群名 ■ ⾃自动配置下发 - 服务上下线⾃自动同步⾄至订阅⽅方 ■ HAProxy不⽀支持 兰建刚
  • 9.负载均衡 负载均衡 RPC解决⽅方案 - 内置LB SDK ■ 服务⾃自注册/⾃自发现 ■ 配置少 - 只需要服务名+集群名 ■ 部署简单 - 随应⽤用⼀一起部署 ■ RoundRobin - 简单可⽤用 兰建刚
  • 10.负载均衡 兰建刚 负载均衡 client Redis/DB解决⽅方案 - GoProxy ■ DAL - DB代理,sharding,读写分离 ■ Corvus - Redis代理,redis cluster,协议转换 ■ DAL/Corvus作为服务⾃自注册 ■ GoProxy ■ 基于Go语⾔言 ■ 订阅DAL/Corvus注册事件 ■ 带服务发现的HAProxy:配置少 ■ 业务⽅方改造成本低 port? goproxy dal dal dal
  • 11.负载均衡 负载均衡 Tips ■ ■ ⻓长连接 vs 短连接 ■ 把⻓长连接当短连接⽤用 ■ 以节点⽽而不是连接做负载均衡 健康检测 ■ 客户端与服务端⼼心跳检测 ■ 可扩展健康语义:进程在、端⼝口活着不代表服务“可⽤用” ■ “半死不活”⽐比“死透了”伤害更⼤大 兰建刚
  • 12.⼤大纲 ⼤大 纲 负载均衡 ⽆无损升级 基础组件设计 兰建刚
  • 13.⽆无损发布 ⽆无损发布 最初的状态 ■ 开发都有⽣生产权限 ■ 随时随地发布 ■ 没有考虑⽆无损发布这回事 诉求:“⼀一单都不能丢” 兰建刚
  • 14.⽆无损发布 兰建刚 ⽆无损发布 经典解决⽅方案 1. 服务端准备下线 client 2. 通知客户端 3. 客户端停⽌止向服务端发送新请求 4. 服务端等待正在处理的请求结束 5. 服务端下线 server
  • 15.⽆无损发布 兰建刚 ⽆无损发布 经典解决⽅方案 1. 服务端准备下线 client 2. (通知)(所有)客户端 3. (客户端停⽌止)向服务端发送新请求 4. 服务端等待正在处理的(请求结束) 5. 服务端下线 server
  • 16.⽆无损发布 ⽆无损发布 RPC调⽤用 • 服务发现机制 • 注销时所有客户端都会得到通知 • 客户端与服务端直连 • 客户端从可⽤用列表⾥里剔除准备下线的服务 • 绝⼤大多数的RPC的响应时间在秒级以下 • sleep 2s搞定 兰建刚
  • 17.⽆无损发布 兰建刚 ⽆无损发布 client 数据库访问 • 客户端使⽤用jdbc/sqlalchemy通过GoProxy访问DAL goproxy • 没有通知机制 dal • goproxy⽀支持mysql协议 • ⽀支持dal侧连接重连 • 客户端改造:限制连接存活时间 dal dal
  • 18.⽆无损发布 ⽆无损发布 Tips • 服务⼼心态:能⽤用技术解决的尽量⽤用技术解决 • 业务⽅方的改造能节省中间件的很⼤大精⼒力 兰建刚
  • 19.⼤大纲 ⼤大 纲 负载均衡 ⽆无损升级 基础框架设计 兰建刚
  • 20.基础框架设计 兰建刚 开放式架构 - 基于组件 给业务开发团队 最⼤大限度的⾃自由 Biz Container Conf Runtime Ref. Trace Route 熔断 限流 Log RPC SLB HB
  • 21.
  • 22.基础框架设计 兰建刚 开放式架构 - 基于运⾏行时 给业务开发团队 最⼤大限度的⾃自由 Biz Container 封闭 Conf Runtime Ref. Trace Route 熔断 限流 Log RPC SLB HB DataSource
  • 23.基础框架设计 开放封闭原则 《敏捷软件开发-原则、模式与实践》 兰建刚
  • 24.基础框架设计 兰建刚 开放封闭原则 《饿了么基础框架实践》 基础框架应该是可以扩展的,但是不可“选择”的
  • 25.