写点什么

百度贴吧王伟冰:跳出历史技术栈,谨慎寻找最佳优化思路

  • 2016-06-23
  • 本文字数:3669 字

    阅读完需:约 12 分钟

从 2003 年诞生到现在,基于兴趣聚合的百度贴吧已经走过了 13 年,随着用户、流量的不断增长,业务的不断复杂化,研发团队的规模不断扩张,百度贴吧这 13 年经历了 LAMP 化、服务化、私有云化等阶段。然而面对每一次架构调整,贴吧是如何在无数优化方向中选择最适合现状同时又兼容未来的技术方案?其中贴吧团队又需要经过多少调研多少试验才能进行判断与落实?

2016 年 7 月 15-16 日, ArchSummit 全球架构师峰会将在深圳举行。本届大会,我们邀请了百度贴吧架构师王伟冰,前来分享《百度贴吧性能优化之路》的内容,讲述的是站在历史13 年的视角上看百度贴吧是如何一点一滴归纳总结得来不易的性能优化思路和经验的。

现在我们就来采访王伟冰老师,让我们提前预览每一次架构变动背后的细节与故事吧。

受访嘉宾介绍

王伟冰,2010 年加入百度,参与设计开发百度Memcached、Redis、通用反作弊等通用服务,服务百度50+ 产品线,日pv 上万亿。负责百度LNMP 基础设施(Nginx、PHP、HHVM、RPC 中间件、扩展、基础库等)开发维护;负责百度OXP 私有云平台建设; 负责百度贴吧性能优化;优化PC、移动、Native 客户端的用户访问速度;建立了全面的性能评估、分析、监控体系等工作。

InfoQ: 您从 2010 年开始加入百度至今已经 6 年了,能否谈谈这些年您经历了哪些团队变化和成长,这些年给您最大的收获和教训是什么?

王伟冰:前四年我一直在社区基础技术 - 架构团队,做过各种通用服务和通用组件,如 Memcached、Redis、Antispam、HHVM 等等,服务于百度内部的各种业务,包括知识、贴吧、移动云等。近两年也参与了贴吧业务,做过性能优化、业务监控等。

基础技术的视角和业务的视角是很不一样的,两方面都做过之后看问题会更全面。比如做基础技术的时候会从业务的角度去想,业务为什么需要这样的技术,为什么会用你提供的东西;而做业务的时候也会想,这个东西如何抽象,做成更通用的技术让更多人可以使用。

InfoQ: 您曾参与开发设计百度 Memcached、Redis 等数据缓存技术方案,能否谈谈它们各自的业务范围以及为什么选用了它们?能否简单介绍百度的存储架构设计经历了怎样的迭代与发展?

王伟冰:做 Memcached 是 2011 年,当时公司内不少业务在用 Memcached 来做缓存,但都各自运维,在集群化方案、高可用方案、一致性方案上都有一些缺陷,所以我们就做了一个基于 Memcached 的通用缓存服务,并提供封装好的客户端,用户不需要再关心分布式、高可用上的细节,并提供延迟删除的功能来解决 Cache 与 DB 数据不一致的问题。

当时我们也有高写入性能、持久化存储的需求,比如浏览计数、最近访问列表,那时 Redis 还没有火,我们基于 Berkeley DB 做了一套小数据 kv、klist 存储服务,解决了当时的业务问题。到了 2012 年,我们有了一些更复杂的需求,比如列表 top 排序、过期自动失效,这时我们发现有 Redis 这个东西,非常适合做这个事情,而且性能很高,所以开始做 Redis 存储服务。

百度的存储架构,这个 Topic 太大了,比如网页库存储就是一套非常复杂的体系。具体到社区业务而言,主要是经历了 3 个阶段:08 年以前,是专有 C 模块存储;08-12 年,逐步 LAMP 化,Mysql+Cache 成为主流;12 年到今,则是 Mysql+Nosql 并存,Nosql 除了 Memcached/Redis, 还有各种百度内部实现的 kv、klist、table 系统,满足各种不同的业务需求。

InfoQ: 你们逐渐从 LAMP 架构转移至 OXP 私有云架构,能否简单介绍开发 OXP 的初衷和背景分别是什么?OXP 是如何统筹兼顾开发框架、测试环境、运维平台、监控系统等模块以及各模块之间是如何联系如何协同工作的?

王伟冰:LAMP 化、服务化、私有云化是贴吧架构的 3 个重要的变革点,LAMP 化是提升单个模块开发效率,服务化是提升大团队协作开发效率,而私有云化则是提升运维效率。

在 LAMP 化的过程, 我们抽取出一套通用的开发框架和平台,称为 ODP(Online Develop Platform),用这套框架业务可以快速地开发新应用。但是随着业务规模越来越复杂,机器规模越来越大,测试、运维方面的问题变得越来越突出,开发人员更多的时间都花在搭建测试环境、上线、处理线上问题。我们意识到要提升全流程的效率,而不仅仅是开发阶段的效率。因此我们做了全流程的解决方案,包括开发 (Develop)、测试 (Testing)、运维 (Operation)、监控与问题定位 (Monitor),这就是 OXP 私有云。

在 OXP 私有云中,我们通过定义一系列的规范,比如目录规范、日志规范、RPC 规范,把整个流程串起来。只要用我们的开发框架进行开发,应用就是符合规范的,我们就可以按照这个规范去运维、去构建测试环境、去采集日志进行监控分析。规范就像一个协议,每个服务、每个平台都遵守这个协议,那么整个流程就可以很好地串起来。

在迁移私有云的过程中,难点在于如此庞大的业务如何平滑地进行迁移。每一次架构的大改动,都需要花费数月的时间。在这个期间,新老系统是并存的,我们设计了一些方案,保证一个业务可以同时存在新系统和老系统,代码自动同步,流量可以自由切换,然后再逐个业务去切换。

InfoQ: 服务端上,贴吧分别在 Native 端和 WebApp 上的优化思路有什么不同,在各端上贴吧应该分别侧重哪些环节和服务?

王伟冰:Native 和 WebApp 存在很大的不同,Native 的行为更可控,我们在网络协议上做了很多优化。WebApp 的优势在于渲染上比较灵活,所以我们做在延迟加载、分段加载等方面做更多功夫。

Native 和 WebApp 的融合也是近年的一个趋势。我们也在尝试多个思路,比如用配置来控制 Native 的展现、用脚本来控制 Native 展现(如 React Native)、嵌入浏览器内核的 Hybrid 模式,这些方法都各有各的优缺点:

  1. 配置方式的性能最好,但灵活性差 ;
  2. 浏览器方式的灵活性最好,但性能差;
  3. 脚本方式兼顾了性能和灵活性,但实现成本又较高,更容易出问题。

目前来说还没有看到哪一种有特别明显的优势,所以目前是根据不同业务的需求场景来选择合适的技术,比如产品核心页面更重性能,可以用配置方式; 运营类页面更重灵活性,可以用浏览器方式;脚本方式作为一种比较新的技术,可以在新业务上进行尝试。

InfoQ: 您曾负责百度贴吧性能优化,节约过半服务器,能否具体谈谈该阶段的优化背景,你们团队在各环节做了哪些优化以达到这个效果?在贴吧性能优化上有没有长期的指导思想(优化思路)?

王伟冰:14 年初的时候,贴吧流量涨得很厉害,服务器规模大涨,所以决定做性能优化。最主要是做了两件事情,RPC 中间件优化和迁移 HHVM,这个优化效果是贴吧历史上优化最好的,节省了过半的前端服务器。性能优化最主要有两个思路,一是尝试引入新技术(如 HHVM),二是分析业务的性能瓶颈并做针对性的优化,这两个方案往往是最有效的。

新技术的引入是需要比较谨慎的,选择 HHVM 我们也是观察了较长时间,在内部做了很多试点,发现 HHVM 性能确实很高,兼容性、稳定性也还不错,同时社区很活跃,所以才决定全面迁移。除了主动地做性能优化,更重要的是防止退化。我们现在设计了一些监控算法,能够实时地发现性能的变化。当发现性能变化时,我们会对比分析性能的构成,看看哪部分的模块或者哪部分的函数耗时发生了变化,同时我们也会查找当时的变更事件,看看是否是有相关的上线变更操作,导致性能发生了变化。

InfoQ: 贴吧已经是 13 岁的“老”产品了,您和您的同事是否遇到过不敢处理的“似是而非”的代码?遇到这种情况应该怎么处理?能否分享面对具有大量历史代码的产品的处理经验?

王伟冰:老代码肯定是存在的。不过由于贴吧历史上经历了多次大规模的架构改造,大部分代码都被重写了,剩下小部分,也是一些很边缘、不重要的功能,平时并不怎么会接触到。

在性能优化的过程中,我们是尽量避免去改业务代码的。即使要改,也会尽量地兼容以前的逻辑,不管这些代码是新的还是老的。当做大的重构项目的时候,我们会去梳理所有的业务逻辑,对于不再有用的代码,和产品确认之后,就会去掉。

InfoQ: 从 13 年开始贴吧已经面临 100 亿流量的规模了,能否谈谈现在移动化 + 社交背景下,贴吧架构现在面临了哪些瓶颈、遇到了哪些新的挑战并且如何应对?

王伟冰:性能优化是无止境的,一方面业务还在变得更复杂,流量还在涨;另一方面,比较好做的优化我们都已经做了,未来的优化将会更难,这对我们是很大的挑战。这时候需要跳出原来的技术栈,从更上层或者更低层的技术栈来看优化。比如从上层角度看,业务需求本身是可以优化的,例如有些需求不一定合理,有些功能不一定有用,把这些干掉性能就上去了;从低层角度看,资源层还有较大的优化空间,通过资源的合理混布、智能调度可以让资源更加节省。

除了性能之外,研发效率是更大的挑战。从业务上看,贴吧的产品形态正在变得越来越多元化,对研发效率的要求也越来越高,我们也在不断地完善私有云,以支撑业务更快地迭代。

InfoQ:感谢王伟冰老师接受我们的采访。期待您在 ArchSummit 全球架构师峰会上的分享。


感谢陈兴璐对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-06-23 19:004165
用户头像

发布了 26 篇内容, 共 91299 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

[译] R8 优化:Null 数据分析 (第二篇)

Antway

6月日更

Python——命名元组 (namedtuple)

在即

6月日更

现在后端开发都在用什么数据库存储数据?

Linux服务器开发

MySQL 数据库 后端 中间件 Linux服务器开发

拆分电商系统为微服务

唐江

架构实战营

架构实战营 模块六:课后作业

Ahu

架构实战营

架构师实战营 模块六作业(拆分电商系统为微服务)

好吃不贵

业务架构

Dajngo网站开发---Task2

IT蜗壳-Tango

6月日更

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Java 程序员 架构 面试

架构实战营 模块六作业

netspecial

架构实战营

堆与堆排序

wzh

Java 数据结构 算法 堆排序 数据结构与算法

备战618!分布式电商项目:天猫Java亿级高并发架构设计笔记

Java架构追梦

Java 阿里巴巴 架构 面试 亿级架构

金融科技加速经济低碳转型 但面临政策、市场、技术等多方挑战

CECBC

双非渣本后端,三个月逆袭字节,入职那天“泪目”了

Java架构师迁哥

模块6 学习总结

TH

前端 JavaScript 之『节流』的简单代码实现

编程三昧

JavaScript 大前端 js 防抖节流 代码实现

[译] R8 优化:Null 数据分析 (第一篇)

Antway

电商系统微服务拆分设计

Lane

Redis入门一:简介

打工人!

数据库 nosql redis 6月日更

「SQL数据分析系列」8. 分组和聚合

Databri_AI

数据库 sql 大数据 存储 计算

四个决策树让你彻底掌握 HTTP 状态码

看山

HTTP 6月日更

模块6作业 拆分电商系统为微服务

TH

架构实战营

Three.js杂记(十二)—— VR全景效果制作·中

空城机

大前端 three.js 6月日更

Angular | 浅谈Angular错误处理方式

devpoint

angular.js angular 6月日更

经济日报刊评:数字人民币应用场景拓展

CECBC

setTimeout(〒︿〒) 请原谅我一直以来对你的忽视

编程三昧

JavaScript 大前端 定时器 基础知识

模块6课后作业

方堃

排序算法之冒泡排序

xcbeyond

排序算法 冒泡排序 6月日更

微服务的由来

卢卡多多

微服务 6月日更

太为难我了,阿里面试了7轮(5年经验,拿下P7岗offer)

Java 程序员 架构 面试

手写一个简单的SpringBoot Starter

赵镇

🌏【架构师指南】分布式事务(XA)与一致性算法(Paxos、Raft、Zab、NWR)

洛神灬殇

ZAB raft协议 paxos协议 6月日更

百度贴吧王伟冰:跳出历史技术栈,谨慎寻找最佳优化思路_架构_李东辉_InfoQ精选文章