13:30 14:20 朱羿全 苏宁高可用拼购系统的架构设计与优化实践
2020-03-01 289浏览
- 1.
- 2.CONTENTS 1 拼购系统架构初瞰 4 应用层优化实践 2 网络层优化实践 5 数据库层优化实践 3 Web层优化实践 6 保障体系建设
- 3.拼购系统架构初瞰
- 4.拼购系统业务架构图 服务中台 拼购平台 拼团链路 社交玩法 拼友圈 邀新团 订单红包 助力团 砍价团 膨胀红包 推客 抽奖团 会员签到 前台展示 立即开团/ 参团 购物车 展示 提交订单 分享邀人 参团 支付 回调 支付前 检查 拼团成功 苏宁易购APP 促销首页 苏宁拼购APP 促销展示页 拼购WAP页 拼购微信小程序 会员中心 商品中心 库存中心 寻源中心 价格中台 促销中台 订单中台 支付中台 物流时效 基础后台 订单查询 独立招商活动报名 虚拟商品活动报名 促销详情页 普通活动报名 大额商品活动报名 商品四级页 特卖活动报名 第三方活动报名 物流管理 供应链管理 采购管理 前台展示 财务 中心 大数据 中心
- 5.拼购系统技术架构图 SaaS 公共系统 应用防火墙/风控/验证码平台/短信平台/统一调度平台 业务系统 Spring MVC 管理平台 中间件平台 PaaS 异 Redis 分 数 步 中 布 据 队 间 式 库 列 件 调 中 中 Sedis 用 间 间 中 件 件 间 SNDP 件 WindQ RSF Nginx+lua 中 间 件 AAA P A S S P O R T 密 码 管 理 CD/测试 监控与跟踪 U A A 统 一 权 限 SCM/ACM 调 用 链 统 一 日 志 平 台 统 一 告 警 平 台 C D 发 布 平 台 压 力 测 试 平 台 性 能 测 试 平 台 ITP+ITSM/CMDB 配置管理 数据平台 Zookeeper IaaS MySql Redis HBase Elasticsearch OpenStack/存储/网络/DNS/CDN Kafka MQ
- 6.架构优化全景图 监控与告警 客户端 CDN 网络层优化实践: • httpdns 应用 • http/2 应用 Ctrix 应用防 火墙 WEB 服务器 应用 服务器 数据 服务器 非功能性优化 • 安全防护 • 流量控制 • 风险防控 • 访问控制 API网关实现 应用与业务逻辑优化: • 提交订单异步化 • 分布式锁优化 • 库存扣减异步化 数据层优化: • Redis热点缓 存问题优化 • 数据库分库分 表策略与读写 分离
- 7.网络层优化实践 TARGET 减少网络层传输的开销
- 8.客户端请求时间分解图 navigationStart redirectStart redirectEnd fetchStart domainLookupStart domainLookupEnd connectStart responseStart (secureConnectionStart) connectEnd requestStart responseEnd 首包时间=responseStart-connectEnd-排队时间-应用响应 缓存获 取时间 首屏 =用户看到第一屏 浏览器内所有的元素呈 DNS解 析时间 剩余包时间 SSL 握手 TCP建 连时间 loadEventStart Queueing time 排队 时间 应用 响应 HTML加载=responseEnd-domainLookupStart-排队时间-响应时间 现所花费时间,按照首 domComplete domContentLoaded domInteractive domLoading 资源加载 DOM解析 屏内最慢一个图片加载 完成时间为截止时间 loadEventEnd Application server time 页面渲染 白屏=firstPaintTime-navigationStart 可交互=DOMready =domInteractive - navigationStart 完全加载
- 9.httpdns减少dns解析耗时 传统LocalDNS解析方式 客户端每5秒针对域名会做一次DNS解析 httpdns接口服务方式 httpdns接口返回域名到IP的A记录,客户端将 解析值默认缓存1分钟 Local DNS(运营商) Httpdns 服务 1 2 用户 网站权威 DNS(中网) httpdns接口服务方式 3 httpdns接口返回域名到IP的A记 6 CDN 全局负载均衡系统 4 5 7 录,客户端将解析值默认缓存1 CDN 区域负载均衡系统 分钟 CDN 缓存服务器 查询 评估 缓存
- 10.客户端httpDNS交互过程 主工程 开始 请求数据 反馈结果 参考微博研发团队的HTTPDNSLib httpdns模块,独立线程请求网络数据,和定时清理过期数 据 httpdns模块,同步返回数据 客户端 传入一个url获取domain信息 返回数据 有可能为空(null的时候是 因为缓存和内置都有数据) 查询domain 记录 服务器ip地 址优先级排 序 查询数据库 缓存 插入本地 cache (数据库) 查询内置域 名信息表 测速模块 1.httpdns api域名直 接请求 根据最后测 速速度排序 2.如果域名请求出错, 则根据内置httpdns 和服务器ip请求,根 据运营商、地域等信 息筛选节点 请求数据为空, 使用默认请求方式 切换线程检 测,检测本 组数据是否 需要更新 为了不影响ui线程,这里切 换其他线程处理任务 httpdns api交互 流程 3.通过本地dns服务 商获取数据
- 11.HTTP/2实现网络传输的多路复用 Http1.1 请求过程利用keepalive+pipeline机制,尽量减少传输 损耗,无法避免Http队首阻塞问题,同时增加了Tcp建连开销 Http/2 数据采用二进制帧代替纯文本作为数据传输的单元,支持 多路复用,帧乱序后在服务端重新组装,一个主机只需要一条Tcp 链路,最大限度减小了网络传输的开销
- 12.拼购整体网络层优化效果 安卓的加速效果对比 IOS的加速效果对比
- 13.Web层优化实践 TARGET 实现API网关 减少服务端压力 提高系统整体吞吐能力
- 14.API网关层实现接口聚合与收敛 搜索默认词和热词 二级类目 logo 应用场景: 头图广告 栏位信息 对于拼购展示频 道页而言,接口 过多会严重影响 页面加载 不同楼层信息 底部导航栏信息
- 15.API网关层实现接口聚合与收敛 聚合: Nginx层实现API A系统服务 网关路由,将对 不同系统不同服 务的调用合并成 统一http服务提 客户端 统一的 http服务 API 网 关 层 路 由 供给前端调用 B系统服务 收敛: B系统服务端 接口聚合后,使用 统一域名的http服 C系统服务 Nginx+lua A系统服务端 C系统服务端 务,实现域名收敛, 更好地应用http/2 协议提高网络传输
- 16.API网关层实现数据本地缓存 应用场景:促销高峰期,拼购 数据查询量往往很大,如果所 有查询服务都透传到服务端, 会给服务端造成很大压力 Nginx通过Lua读取Redis集群 缓存,如果不命中才回源到后 端应用服务器集群;后端应用 服务器集群再读取Mysql数据 库,同时更新Redis缓存。 一致性hash 读缓存 回源到应用 服务器 一致性hash 更新缓存 应用服务器集群
- 17.应用层优化实践 TARGET 提供高可用 高性能 高并发的应用层服务
- 18.分布式锁的合理使用 应用场景: 防止单个用户重复开团、参团、领券 第一代分布式锁实现:redis事务事务+watch实现 原子操作 缺点:仅支持单redis操作,热点活动秒杀场景下, 会造成极大的性能瓶颈 jedis.watch(tmpLockKey); // watch操作 Transaction transaction = jedis.multi(); // 返回一个事务控制对象 transaction.setnx(tmpLockKey, “lock”); // Set if Not Exist transaction.expire(tmpLockKey, locktime); // 设置锁过期时间 Listrets = transaction.exec(); // 事务执行
- 19.分布式锁的合理使用 第二代分布式锁实现:一致性hash实现redis分片 缺点:Redis 的主从异步复制机制可能丢失数据,会出现如下场景:A 线程获得了锁,但锁数据还未同步到 slave 上,master 挂了,slave 顶成主,线程 B 尝试加锁,仍然能够成功,造成 A、B 两个线程并发访问同一个资源 第三代分布式锁实现:基于 ZooKeeper 实现的分布式锁服务 在 /resource_name 节点下创建临时有序节点 获取当前线程创建的节点及 /resource_name 目录下的所有子节点,确定当前节点序号是否最小,是则加锁成功。否则监听序号较小的前一个节点。
- 20.异步化数据库操作一 应用场景一:拼购爆品的活动库存扣减问题 通过对缓存操作代替对数据库的操作,保证最终一致性 优化方式: 每完成一次库存扣减操作先对 缓存进行操作,同时每隔一段 传统方式: 每完成一次库存扣减操作要对数 据库进行update. 对单行(热点 活动)的大量update操作会导致 大量排他锁(TX),严重影响性能 时间定期通知数据库更新
- 21.数据对比 测试环境下,通过数据库 测试环境下,通过缓存扣减库 update操作扣减库存: 存,定期通知数据库:
- 22.异步化数据库操作二 应用场景二: 应对促销高峰,开团/参团流程的优化 开团成功直接返回用户结果,订单、团、团详情等信息 通过队列异步入库
- 23.数据对比 测试环境下, 传统同步参团方式: 测试环境下,通过队 列,异步化参团方式:
- 24.数据库层优化实践 TARGET 提升数据库并发处理能力 解决redis热点问题
- 25.解决Redis热点缓存问题 应用服务 应用进程 1.本地缓存查询 2.分布式缓存查询 应用场景:虽然实现了redis集群,但针对爆款活动、 Guava Cahe 回填 Redis 回填 Mysql 3. 数 据 库 查 询 秒杀团的热点key,仍然会造成集群负载不均,单台 redis高压力的问题 通过Guava Cache构建本地缓存,两级缓存模式解决 redis热点问题
- 26.数据库分库分表的实现 数据库中间件方式(如MyCat) 优势:对业务层透明 劣势:对于不基于主键的DML操作,代价极大 采用数据库中间件, ? 中间件本身如何保证高可用性,如自动故障切换、 数据恢复等是否存在坑 还是业务层解耦来实现分库分表? 业务层解耦方式(snf-dal)采用 优势:风险可控,实施性强 劣势:业务改造量大
- 27.数据库读写分离的实现 写入 应 用 服 务 器 写VIP 写库 binlog 文件 snf-dal组件 Canal 读库1 读取 读VIP 读库2 读库3 同步
- 28.保障体系建设 TARGET 系统可用性最后的屏障 洪峰下的应对策略
- 29.监控
- 30.限流
- 31.风控
- 32.H E L L O W O R L D
- 33.