瓜子二手车高级技术总监纪鹏程 - 瓜子服务架构的变迁和性能优化

危恨风

2017/11/14 发布于 技术 分类

首先会介绍性能优化的总体概括;I/O方面、网络方面、计算方面、架构方面的优化思路;性能监控平台的搭建;瓜子二手车网经历了哪三个架构版本,以及每个版本碰到的问题和解决思路;以瓜子性能上的EP实践为例做详细的解读;同时,随着技术引领,微服务也在瓜子网落地,讲讲微服务化架构的性能优化历程。

文字内容
1. 瓜子服务架构的变迁和性能优化 纪鹏程@瓜子二手车
2. 自我介绍 • 2000.9-2004.7 • 2004.9-2007.7 • 2007.7-2011.5 • 2011.5-2015.9 • 2015.9-now 南开大学 中科院软件所 百度-贴吧 赶集 瓜子二手车
3. 演讲大纲 • Web性能的优化思路 • 瓜子Web架构的优化过程 • 微服务化的挑战
4. Web性能的优化思路
5. 性能的层级
6. 速度的量级 •L1 cache reference 0.5ns •L2 cache reference 7ns •Read 1M sequentially from memory 0.25ms •Disk seek 8~10ms •Send 1M bytes over 1Gbps network 10ms •Read 1MB sequentially from disk 20~25ms
7. 系统性能的木桶定律
8. IO介绍 • 媒介: • 读写方式: • 加速设计: • 系统缓存: 磁带、磁盘、SSD 顺序读写、随机读写 缓存、预读、回写 IO buffer、Direct IO “内存是新的硬盘,硬盘是新的磁带” -Jim Gray
9. 磁带
10. 磁盘的物理结构
11. IO的优化 • 相关联的数据物理相邻,减少IO的读写次数 • 提高顺序读写的比例 • 举例:贴吧帖子、LevelDB
12. 数据库的优化 • 减少表的join操作 • 一定程度上反范式设计 • 索引量的折中,兼顾读和写 • KV存储系统的使用 • 慢查询的控制
13. 网络层的优化 • C10K问题 • select、epoll(ET、FT) • TCP、UDP、HTTP、WebSocket • 长连接、短连接 • 同步、异步 • 阻塞、非阻塞
14. 前端优化 • 合并请求 • 域名拆分 • 模块化&按需加载 • 开启Gzip和HTTP/2 • 开启KeepAlive • Minify
15. 编程语言的选择 • 性能 • 生态的完备性 • 复杂度 • 领域相关 • 多进程/线程、协程
16. 性能监控的方法 • 代码打点 - 优点:简单、高效,对系统性能损失小 - 缺点:每次都需要修改代码、不够全面 • 增加性能插件 - 优点:一次部署,终身受用 - 缺点:系统性能损耗 • 使用APM产品 - 优点:使用简单,部署快,全面 - 缺点:需要一定费用,也有一定的损耗
17. 总体原则 • 寻找合适的性能监控方法 • 找出最短的短板 • 甄别短板类型(IO密集、网络、计算密集) • 针对性解决 前期抓大放小,后期精细处理
18. 瓜子WEB架构的优化过程
19. 质量、及时交付、性能
20. V0.1的架构
21. V0.1的启示 • “过早优化是一切罪恶的根源” • 主要精力集中在业务上,快速迭代 • 尽量采用第三方服务 • 不加应用级cache • 消除架构中的“单点” • 数据安全性 • 数据字典的确立
22. V0.1的问题 • 代码可维护性差,新人介入成本太高 • 耦合太紧密,微小的错误也会带来整体的crash • 全部业务都在一个DB实例上,性能扩展性极低 • 日志缺乏和规范不统一,定位问题困难 • 系统、应用、业务级别的监控缺乏
23. V0.5的架构
24. V0.5的启示 • 业务级别的代码拆分 • DB上按照业务分实例 • 统一日志规范 • Open-falcon的应用 • 基于Twenproxy的redis集群 • 简单逻辑直接走openresty
25. V0.5的问题 • 业务内部拆分不够细,耦合依然比较重 • 代码分层混乱,越级、跨级调用多 • 业务间接口调用方式千差万别 • 接口的可用性和性能监控不够 • 上线工具不完善,不支持回滚 • 测试以黑盒为主
26. V1.0的架构 3&҈:$3 አಁᒒ$33҈ૡ֢$33 ᬩ០‫ݣݸ‬ҁත᫣̵ࠓ᫣̵ਭ໐҂ &20021$3, ᕚᔱ๐‫ۓ‬ ᫣რ๐‫ۓ‬ ॔༄๐‫ۓ‬ ਮಁᓕቘ ‫ݣ‬ᨴᓕቘ ૡ‫ܔ‬ᓕቘ Ꭸ‫מ‬ ֖ᗝ๐‫ۓ‬ ᦾ‫ۓ‬ ඪ՞ 0\64/0 0\64/҆6 0\64/҆6 ‫ڭ‬ᔮᕹ ᬦಁᓕቘ ᩅ‫ݸ‬๐‫ۓ‬ ᕟᕢຝ຅ വᭆ 5HGLV҆0 ‫מ‬ਭ๐‫ۓ‬ නྃ๐‫ۓ‬ ᦾ‫ۓ‬ᓕቘ ࢶᇆ ‫ੂے‬ 5HGLV҆6 (%6Ӥᕚଘ‫ݣ‬ &DW(\Hፊഴ य़හഝଘ‫ݣ‬ ᆻᡩ VZDJJHUଘ‫ݣ‬ *ଘ‫ݣ‬ $%7HVLQJ ᚕ๜᧣ଶ
27. V1.0的启示 • 业务内拆分更细粒度的服务 • 统一接口规范 • RPC的调用,串行 -> 并行 • 计算密集型改由go服务来实现 • 代码层分级,禁止跨级调用 • 第三方服务增加主备和自动切换机制
28. 单测 • 单测的重要性 • 持续集成的关键 • 先从核心代码开始,逐步提高覆盖率 • 用好的方法让单测更简单 • 要体现在每日构建中
29. 接口 • 接口的重要性与日俱增 • 用swagger集中统一管理 • 接口测试的case管理 • 可用性及性能监控
30. 代码风格 • 设计模式 • 代码规范-(eg:PSR1、PSR2) • 使用git hook,提交前code sniffer准入
31. 前后端分离
32. 微服务化的挑战
33. 架构的复杂度 • 服务注册、服务发现、熔断机制等基础组件 • 架构和部署上带来的复杂度 • 需要很强的OpDev团队 • 根据组织的复杂度来决定服务化的粒度 !架构上的分工来弥补性能的损失和复杂度的 提高
34. 注意点 • 本地调用和远程调用问题 • 服务的粒度问题 • 数据库的问题
35. Q&A