Microsoft 如何使用 DevOps 操作可靠的系统

自商业互联网诞生之初,Microsoft 就一直在运营复杂的在线平台。 在这一过程中,我们发展了一套实质性的实践,以保持系统的可用性、正常性和安全性。 这些做法是维护和改善现场文化的更大举措的一部分。

现场文化

现场文化是组织的重点,它将现场体验和可靠性置于其他一切之上。 毕竟,如今有了云和基于互联网的服务,客户可以很容易地在服务提供商之间移动,这大大增强了客户信任的重要性。 现场必须始终可用,并按照向客户承诺的方式运行。

有各种因素有助于一个成功的现场文化。

Diagram of Microsoft's live site culture.

现场优先

将现场体验放在首位是成功平台不可或缺的一部分。 团队不能把所有的注意力都放在新的、闪亮的功能上,而忽视向用户展示这些功能的途径。 我们依靠安全的部署实践,帮助确保我们的客户享受不间断的平台访问。 当涉及到在没有停机的情况下发布版本化的服务更新时,情况可能会变得特别复杂。

通过功能标志控制曝光

当我们通过环和阶段进行部署,用功能标志控制曝光时,我们偶尔会在生产中发现问题。 尽管我们进行了自动化和审查,但有时还是会发生意外。 所以说,生产环境是独特的环境!

通常,当出现问题时,运行状况监视和遥测会提醒我们。 开发人员可以创建一个分支,main进行修复,并将请求拉入 main。 保持相同的通用工作流程意味着开发人员不必为不同的代码更改切换上下文或学习不同的流程。

要解决修补程序部署问题,还需要一个步骤,即在发布分支中挑选更改。 我们在每个工作日早上从当前发布分支运行一个修补程序部署,尽管我们也可以根据需要进行紧急修复。 该修复程序实际上首先进入了发布分支的生产。 但因为我们首先在 main 中进行开发,所以我们知道在 main 创建新的发布分支时,它不会在下一个冲刺中倒退。

内部部署产品的发布基本相同,尽管没有部署环和阶段。 此外,因为我们对不同的配置和数据形状进行了更多的手动测试,所以在切断发布分支和将产品交到客户手中之间还有更长的时间。

安全性应该由个人负责

重点是使漏洞真实且个人化。 这确保了人们真正关心。 我们还广泛使用战争游戏来发现和解决整个系统的安全风险,无论是否在代码中。 当红队可以通过颠倒对话框来表明他们已经进入了代码时,这确实会激励代码所有者解决这个问题,并确保它不会在其他地方再次发生。 这种竞争比关于潜在 XSS 风险的静态分析警告更真实、更个人化。 我们通过战争游戏和其他安全演习来创造这种文化和活力。 人们以侵入对方的代码或能够阻止这些尝试为荣。 这灌输了一种安全的代码文化。

我们不能为每一个攻击向量制定计划,但我们可以做的是假设会有漏洞,并计划我们对漏洞的反应速度。 我们团队的很多安保工作都围绕着这一点展开。

最后,人类会犯错。 他们有时会犯懒,做一些将密码存储在文件共享中之类的事情。 我们可以告诉他们不要这样做,我们可以让他们接受安全培训,我们可以做其他各种事情。 大多数人都能学会,但只需要一个人就可以打破这个体系。 您可以列出各种各样的最佳实践,但除非您真的做到了,否则您必须假设人们会犯错误。 这需要一定程度的监督,以确保关键流程得到遵守。

工程不仅仅是运营合作伙伴

我们很早就学会了让现场成为工程团队职责的重要组成部分。 这对我们来说是巨大的,因为在过去,一个人可以去部署一些东西,周末离开,周一回来,发现客户支持和运营团队整个周末都在处理的 900 个客户问题。 重要的是,工程部门要为现场问题付出代价。 否则,就没有动力建立避免这些问题的系统。 当您在凌晨 2 点被叫去修理您弄坏的东西时,您会对这种经历刻骨铭心的。

随着我们逐渐承担起这一责任,现场直播是我们做的最重要的事情,成为整个团队的口头禅。 这是他们现在拥有的客户体验,而不仅仅是税收。 这实际上是人们对我们的信赖,我们为此感到自豪。 它需要成为我们产品的一个与众不同的特点。

生产遥测是您服务的心脏

为了在几乎任何事情都可能出错的快节奏世界中生存,我们需要强大的警报系统。 无法操作的警报、冗余警报或庞大的警报量会使您忽略所有警报。 很容易创建太多的警报,所以这个过程实际上可以归结为一个简单的问题:这个警报可以操作吗?这确保了我们处理正确的客户问题并尽快处理。

当工程团队专注于可操作的警报时,他们注意到出现的许多问题,尤其是在半夜,往往都有类似的解决方案,至少是暂时的。 这导致了对更善于故障转移和自我修复的系统的关注。 现在问题发生了,发出警报,然后修复得足够好,工程团队可以等到早上再修复。 如果工程团队只是推出一些让其他人彻夜难眠的零件,这就不会发生。 现在,他们努力平衡这些改进,不仅将其作为特征速度的一部分,而且作为工程改进速度的一个部分。

总结

采用现场文化影响了 Microsoft 构建和交付软件的方式。 通过使工程团队成为安全和操作的关键部分,我们的代码质量和最终用户体验得到了显著改善。 作为运营的全面参与者,工程成为关键的利益相关者,从而产生了为更好的运营而设计的系统。