10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

Kent Beck 揭秘 Facebook 开发部署流程

2013 年 10 月 21 日

Facebook 是世界上最大的社交网站,有超过 10 亿用户每月至少要登录一次,他们每天要上传超过 25 亿内容,支持这样一个站点的运行,还要不断发布新的功能,Facebook 的工程师是如何做到这一切的?目前就职于 Facebook 的极限编程创始人 Kent Beck 在近期发表的一篇与别人合著的论文里向大家详细介绍了Facebook 的开发与部署流程。

显而易见,Facebook 的工程师们不会像传统软件行业那样使用瀑布模型进行开发,他们不断地开发新的功能,并迅速上线,让用户能够访问到这些新功能,这就是大家口中经常提到的持续部署(continuous deployment)。在他们看来,Facebook 的开发永远没有到头的那一天,代码库在不停地增长着,目前已经有超过1000 万行代码,其中850 万是PHP 代码,代码随时间呈现超线性增长的趋势。

在Facebook,所有前端工程师都工作在同一个稳定的分支上,这也能加快开发速度,因为省去了繁琐的分支合并过程。在日常开发中,每个人都用git 在本地进行开发,当代码就绪之后,就会将它推送到SVN 上(之所以是SVN,这是出于历史原因),这样就很自然地区分开了开发中的代码和可以上线的代码。

但是为了保证网站的稳定运行,并非是工程师将代码推送到SVN 上,认为可以上线,代码就能发布上线的。Facebook 采用了一种兼顾了速度与稳定性的做法——将每日发布与每周发布结合到一起。所有的代码变动默认是每周发布,每次发布会包含相对比较多的变更,在每周日的下午,代码会被发布工程师推送到SVN 上,随后会进行大量的自动测试,其中包含很多针对正确性和性能的回归测试,这个版本会成为Facebook 员工内部使用的默认版本,正式的发布通常被安排在周二下午。

发布工程师会为每个工程师的历史表现打分,内部称为“Push Karma”,比如那些代码经常出问题的人,分数就会相对较低,他们的代码自然也会受到更多的“关照”。这样做的目的是控制发布的风险,而非对某人做出评判,因此这个分数是保密的。除此之外,越是大的变更,或者在Code Review 时讨论越是多的代码,也是风险较高的地方,同样会受到更多的“关照”。

在每周发布以外,其他工作日每天会有两次小发布,大多是些非关键性的更新,或者是些Bugfix,极端情况下会进行更多的发布,甚至是在周末进行发布。

在被纳入发布之前,代码已经经过了开发者的单元测试和Code Review,在Facebook,Code Review 是非常重要的事情,他们使用名为 Phabricator 的工具进行 Code Reivew,该工具是和代码版本管理整合在一起的。

在大量的自动化测试之外,每位员工在内部使用 Facebook 时也相当于进行了高密度的测试,每位员工都能报告自己发现的问题,写代码的人多了,代码增长的快了,相对而言,对代码进行测试的人也多了。

在性能方面,Facebook 使用 Perflab 对新老代码的性能进行对比,如果新的代码性能不理想,并且开发工程师无法及时修复,那么相关代码就会从本次发布中剔除出去,待问题修复后再进行发布。每个小的性能问题都是不容忽视的,因为小问题会很快累积起来,变成影响容量和性能的大问题,Perflab 能通过图表的形式直观地展现系统的性能。

像 Facebook 这样一个网站,每周发布自然是分阶段进行的,首先是 H1,即部署到仅有内部访问的服务器上,进行最后的测试,很多公司也称其为“预发布”;随后是 H2,部署到几千台服务器上,开放给一小部分用户;如果 H2 阶段没有发现问题,则进入 H3,部署到全部服务器上。

如果在这个过程中发现问题,工程师会立即进行修复,随后重新开始分阶段的部署。当然,也可以选择回滚代码,有两种回滚方式——常见的是回滚某个变更及其依赖的文件,另一种则是回滚整个二进制包。

Facebook 在四个不同的地理位置分布了大量的服务器,整个发布的包大约有 1.5G,一般需要 20 分钟来完成整个分发。为了实现这一点,分发过程中分发使用了 BitTorrent,分发时也会考虑到机架和集群的亲缘性。自从 Twitter 开源了他们的基于 BitTorrent 的发布方案 Murder 后,通过 BitTorrent 进行发布已然成为了业内的标配。

在发布时,与变更相关的开发者必须在线,发布工程师会通过 IRC 机器人进行确认,如果人不在,那么他的变更会被回滚。这样保证了问题能够在上线之初就被快速发现并修复,当然,想在这么大的一个系统里及时发现一些问题有时也是很困难的,所以 Facebook 会结合内部工具 Claspin 和外部的信息源(比如 Twitter)持续地监控系统的健康状态。

通过 Gatekeeper 系统,工程师们可以方便地控制多少用户能够访问特定的新功能,筛选的条件可以是地区,也可以是年龄,在遇到问题是也能迅速关闭某个功能的入口。在 Gatekeeper 的帮助下,工程师们能方便地进行 A/B 测试,藉此迅速收集用户的真实体验,对产品做出调整。不要忘了,在 Facebook,是工程师来选择自己做什么的,那么工程师们肯定是选择把东西做出来,看看用户的反应,而不是坐在会议室里和一堆人开会去猜测用户想要什么。

Kent Beck 在文中表示:

仅有方法论和工具是远远不够的,因为它们总是会被误用。所以,拥有鼓励个人责任感的企业文化是很重要的。

现在,Facebook 有大约 1000 名开发工程师,仅有 3 名发布工程师,没有独立的测试工程师。每位工程师都可以看到全部的代码,并且能提交补丁,或者提交详细的问题描述。工程师们需要自己编写详尽的单元测试,他们的代码还要通过所有的回归测试,并能支持后续的各种运维工作。

除了要对自己的代码负责,他们还要面对各种巨大的挑战,往往要针对多种解决方案进行大量试验。比如,当时为了解决 PHP 的性能问题,有 3 个不同的方案同时在进行开发,当某个方案的负责人发现另一个方案更好时,他们就会停下来;最后 HipHop 胜出了,但另两组人的精力也没白费,他们提供了重要的备份能力。

在文章的最后,还提到了 Facebook 的新兵训练营制度,关于这一点,Facebook 的早期员工王淮在他的《调教你的新工程师 – 谈新兵训练营》中做了详细的描述。

关于 Facebook,有很多值得深入学习和探讨的地方,比如他们的工程师文化,比如上文提到的新兵训练营。不知您在看了 Kent Beck 的文章之后有何感想,能否和 InfoQ 的读者们一同分享一下呢。

2013 年 10 月 21 日 09:056308
用户头像

发布了 135 篇内容, 共 52.9 次阅读, 收获喜欢 35 次。

关注

评论

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

Java面试胜经001| 阿里Java面试题118道

BUZHIDAO

面试

java并发系列 :实战篇,微服务日志的伤痛,一并帮你解决掉

南方有乔木兮

没想到 Hash 冲突还能这么玩,你的服务中招了吗?

程序猿石头

Java 安全攻防 hashmap hash 后端开发

搞事情?Spring Boot今天一口气发布三个版本

YourBatman

Spring Boot 新特性

企业架构实施简介

周金根

比 996 更可怕的是职场 PUA

非著名程序员

职场 职场成长 职场误区 职场 PUA

两个单向链表是否存在合并元素

周冬辉

【总结】性能优化2

小胖子

ARTS-WEEK8

一周思进

ARTS 打卡计划

关于架构的几件小事:架构决策

北风

架构 架构设计 架构师 架构设计原则

LeetCode题解:206. 反转链表,JavaScript,While循环迭代,详细注释

Lee Chen

LeetCode 前端进阶训练营

癌症筛查清单

Lee Chen

随笔杂谈 前端进阶训练营

TOGAF实用教程(IT帮)

周金根

编程核心能力之重构

顿晓

学习 重构

架构师训练营 第八周 总结

Poplar

“链”上普洱,云南省区块链中心走进大美普洱

CECBC区块链专委会

区块链+ “链”上普洱 数字云南 分布式产业

产业区块链一周新动态

CECBC区块链专委会

多项扶持政策 产业研究高涨 学会协会成立 应用频繁落地

Java架构-代码分层的设计之道

我是苞谷

拥抱400GE新引擎,跨越新基建的时代龙门

脑极体

Zookeeper从入门到放弃之Zookeeper典型应用场景

小隐乐乐

zookeeper 分布式 分布式锁

一个成都程序猿眼中的成都和天府软件园,先从蚂蚁金服说起…

why技术

程序员 成都 蚂蚁金服

首个区块链金融应用规范出炉,标准先行避免“先污染后治理”

CECBC区块链专委会

技术规范 应用评估规则 话语权 政府积极推进

JVM系列-读懂 GC 日志

Rayjun

Java JVM GC

登门槛效应 - 请求帮忙,从小事开始。

石云升

登门槛效应 得寸进尺效应

第八周作业

qihuajun

Java有效面试题

老大哥

面试

JVM系列之:String.intern和stringTable

程序那些事

Java JVM GC 常量池 字符串

Android | xml和view的那些事

哈利迪

android

在线互动课堂低延迟交互利器:高性能异步化设计与监控

徐敏

线程模型 异步 Task 在线课堂

OMG组织的企业架构建模规范

周金根

影响企业架构项目成功的8个重要步骤

周金根

Kent Beck揭秘Facebook开发部署流程-InfoQ