写点什么

Facebook 如何实现大规模快速发布

2017 年 9 月 28 日

不久前有篇关于缩短 Facebook 发布流程的文章,阐述了将代码投入生产的灵活方法。这篇文章着重讲述了他们在一年之内如何从“ cherry-picking ”升级到“ push-from-master ”策略。早些时候, Facebook 分享了他们部署过程的细节。作者 Chuck Rossi 是 Facebook 的首位发布工程师,目前是 Facebook 发布工程的工程总监。

Facebook 的发布周期是“ quasi-continuous ” (准连续)——这只是一种委婉的说法,表明并非每次提交都会部署到生产环境,实际上它采用的是对几十到几百个提交进行批处理,每隔几个小时就进行推送。这种分层发布的方式使任何变更的回滚很容易。

这个新系统从 2016 年 4 月开始,经过一年的时间慢慢地完善。早先的模式是从主干分支的提交中选择特定的变更放到发布分支上。发布分支每天将这些变更推送到生产环境。这种“ cherry-picking ”的特点是,每天选择变更的数量为 500 ~ 1000。剩下的变更就推入到每周发布分支中。随着时间的推移,提交的数量和参与其中的工程师都有所增加,发布工程师的手工劳动变得过多,以至于无法持续。

这个 CD 系统的关键组件是一种控制方法,即谁将接收变更,以及用于部署和测量的自动化工具。在第一步中,经过一系列自动化测试后,变更就从内部推送到 Facebook 员工。在这一阶段发现的任何回归,都会被认为这一进程受阻或者停止。下一步涉及到“ canary deployment ”(金丝雀部署),只推送至生产环境的 2% 。依靠连续的监测来检测问题。如果一切顺利,这些变更将 100% 部署到生产环境中。名为 Flytrap 的工具收集用户报告,并发送任何异常情况的告警。

图片来自: https://code.facebook.com/posts/270314900139291/rapid-release-at-massive-scale

Facebook 中的 Web 和移动产品遵循两条不同的路径,原生移动变更的部署频率低于 Web 。这两个都由名为 Gatekeeper 的系统控制。除此之外,Gatekeeper 还分离出了部署和发布。这种分离带来了挑战,包括维护向下兼容性

由于工具和部署选项的性质,移动持续部署面临着一些特定的挑战。Web 部署则更为容易,因为 Facebook 拥有完整的技术栈和工具。为了解决这些挑战,Facebook 已经构建了一些专注于更快的移动开发的工具和库,包括 Buck Phabricator Infer React 以及 Nuclide 。Facebook 的移动部署是以三层来并发运行。

  • 构建:合并到移动主分支上的所有代码都会进行构建,这会针对受影响的所有产品( Instagram 、Messenger)并且会跨各种芯片架构。
  • 静态代码分析:Linters 和静态分析工具的组合,称为 Infer ,用于检查各种问题,包括资源泄漏、未使用的变量、有风险的系统调用和编码准则违规。
  • 自动测试:包括单元、集成和端到端测试,会使用到 Roboelectric XCTest JUnit WebDriver 等工具。

在代码变更的生命周期内,每次提交都会执行移动构建并运行测试栈,这样就会运行很多次。单单 Android 一天就有 5 万到 6 万个构建版本。移动部署系统遵循较早的基于 Web 的模式,每周发布一次,按 cherry-picking 策略随机选择变更。尽管代码传输速度和发布频率有所增长,但工程师的生产率保持不变。然而,本文提到的标准(代码行和推送次数),可能并非衡量生产率的最佳标准。

2016 年 IEEE 的论文相关讨论,Facebook 早在 2005 年就利用了某种形式的 CD。该论文中的一些结论列出了 CD 成功的先决条件:可观的持续投资、高度熟练的开发人员、强大的技术管理,开放和平等的文化,风险回报权衡管理、客观回顾失败以及有专注力的小团队。

Facebook 的准连续部署系统具备这几个优点:没有推送热补丁的手工开销,对分布式工程师团队有更好的支持,为工程师提供了更快的反馈循环。

查看英文原文: How Facebook Achieves Rapid Release at Massive Scale


感谢张卫滨对本文的审校。

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

2017 年 9 月 28 日 19:003942
用户头像

发布了 325 篇内容, 共 120.5 次阅读, 收获喜欢 802 次。

关注

评论

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

接口请求(get、post、head等)详解

测试人生路

HTTP

原创 | TDD工具集:JUnit、AssertJ和Mockito (二十七)运行测试-在构建工具中运行测试

编程道与术

Java 编程 TDD 单元测试 JUnit

原创 | 使用JPA实现DDD持久化-数据库连接配置:persistence.xml

编程道与术

Java hibernate 编程 mybatis jpa

区块链医疗应用场景有哪些?区块链医疗解决方案

13530558032

大厂都是怎么用Java8代替SimpleDateFormat?

Java架构师迁哥

《华为数据之道》读书笔记:第 3章 差异化的企业数据分类管理框架

方志

数据中台 数据仓库 数据治理 元数据

智慧警务大数据可视化平台智慧公安警务研判系统开发

13530558032

论“万剑归宗”思想对开发设计的一点“肤浅”作用

八苦-瞿昙

随笔杂谈 设计实践

JVM-技术专题-垃圾回收策略

李浩宇/Alex

.NET5发布,这个微软“全家桶”会是.NET的春天吗?

力软.net/java开发平台

.net

IPFS四币连发系统开发技术(四币循环模式)

薇電13242772558

区块链 数字货币

容器化时代到来!跳转机分配问题终于“有救”了

华为云开发者社区

容器 镜像 网络

架构师训练营 1 期 -- 第十周总结

曾彪彪

极客大学架构师训练营

高性能网关原来是这样设计出来的

周老师

Java 编程 程序员 架构 面试

架构师训练营第 1 期-week10

习习

原创 | 使用JPA实现DDD持久化-只要O,忘记R & Maven配置

编程道与术

Java hibernate 编程 mybatis jpa

三分钟带你搞懂分布式链路追踪系统原理

Java架构师迁哥

都是“算法”惹的祸,字节三面处处坑,我的offer要凉了?

马士兵老师

字节跳动 编程语言 算法和数据结构 面试数据结构与算法

mongodb 源码实现系列 - command命令处理模块源码实现一

杨亚洲(专注mongodb及高性能中间件)

MySQL mongodb 高性能 源码剖析 分布式数据库mongodb

家庭留白、中屏崛起与硬件棋局

脑极体

理解三值逻辑与NULL,你离SQL高手更近了一步

华为云开发者社区

sql null 逻辑

Alibaba最新《Java架构核心宝典》限时开放下载,互联网主流技术详解总结,提升技术能力的必备宝典!

Java架构之路

Java 程序员 架构 面试 编程语言

区块链、AI与大数据加持,电子合同更安全、效率更高

CECBC区块链专委会

区块链 大数据

数字经济发展势头强劲

CECBC区块链专委会

数字经济

数字人民币快来了,但多数人可能会有四大误解

CECBC区块链专委会

数字人民币

性能测试界“网红”云性能测试服务,了解一下?

华为云开发者社区

CloudTest 沙箱实验 云性能测试

为什么程序员不做外包

Java架构师迁哥

打工人、打工魂、高效MES助力打工者都是人上人

Marilyn

敏捷开发 快速开发 MES系统

《迅雷链精品课》第七课:以太坊数据存储分析

迅雷链

区块链

区块链防伪溯源平台搭建,助力企业品牌安全体系升级

13530558032

智慧园区管理平台app系统开发,智慧楼宇系统搭建

13530558032

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

Facebook 如何实现大规模快速发布-InfoQ