抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

「不可变基础设施」时代来临,你准备好了吗?

2020 年 4 月 12 日

「不可变基础设施」时代来临,你准备好了吗?

伴随着最近的“容器革命”,一种新概念变得流行起来:不可变基础设施。事实上,「不可变基础设施」这一概念不是刚刚冒出来的,它也不是必须需要容器技术。然而,通过容器,它变得更易于理解,更加实用,并引起了业内广泛注意。


什么是不可变基础设施?

我将其定义为在生产环境中仅通过替换组件而不是修改组件来更改基础设施。具体地说,这意味着一旦我们部署了一个组件,我们就不会再修改它了。这并不是说组件没有任何状态变化(毕竟丝毫不变也就意味着它不是一个非常实用的软件组件),而是说运维人员无须在程序的原始 API /设计之外引入任何改变。


这种情况并不罕见,举例来说,假设我们想要更改某一配置文件,而该配置文件又正在被某些应用程序使用,如果是动态基础设施,我们可能需要使用一些脚本或配置管理工具来进行这种更改。它会对有问题的服务器进行网络调用,然后执行一些代码来修改文件。它还可能了解并修改该文件的依赖关系(比如需要重启的程序)。随着时间的推移,这些关系可能会变得越来越复杂,这就是为什么许多 CM 工具都有一个资源依赖模型来帮助管理它们。


动态基础设施 VS.不可变基础设施

动态基础设施与不可变基础设施之间的权衡其实非常简单。使用网络和磁盘 IO 等资源,动态基础设施效率更高。在这种效率下,传统上它的速度要比不可变快,因为它不需要像许多版本的组件那样需要推送那么多的比特或存储。回到我们更改文件的例子。传统上,比起更换整个服务器,更换单个文件无疑更快。


另一方面,不可变的基础设施为结果提供了更强有力的保障。不可变的组件可以在部署之前预先构建,生成一次,然后重复使用,这与动态基础设施不同,后者的逻辑需要在每个实例中进行评估。这就可能造成意料之外的结果,因为您的某些环境可能处于您期望的不同状态,导致部署出现错误。您可能只是在配置管理代码中犯了某个错误,但您又无法在本地复制生产环境的状况,因此可能很难测试该结果并发现错误所在。毕竟,这些配置管理语言本身很复杂。


在“计算机协会”(ACM)杂志 ACM Queue 的一篇文章中,Google 的工程师清楚地阐述了这一挑战:


结果是,人们试图通过消除应用程序源代码中硬编码的参数来避免这种神秘的“配置”。它不会降低操作复杂性或使配置更容易调试或更改;它只是将计算从真正的编程语言转移到特定于领域的编程语言,而这个领域通常具有较弱的开发工具(例如调试器、单元测试框架等)。


容器时代的变局

效率的权衡一直是计算机工程的核心。然而,随着时间的推移,这些决策的经济学(包括技术和金融层面)都在改变。


在编程的早期,开发人员被教导使用简短的变量名,以牺牲可读性为代价来节省几字节的宝贵内存。为了解决早期硬盘驱动器的空间限制,开发了动态链接库,以便程序可以共享公共的 C 库,而不是各自需要自己的副本。


而在过去的十年里,由于计算机系统的强大功能的改变,这两种情况都发生了变化。现在,开发者的时间比我们通过缩短变量节省的成本要昂贵得多。像 Golang 和 Rust 这样的新语言甚至带来了静态编译的二进制文件,因为如果发生错误的 DLL,将无法处理平台兼容性问题。


基础设施管理正处于类似的十字路口。公有云和虚拟化不仅使得服务器(虚拟机)的速度快了几个数量级,而且像 Docker 这样的工具已经创建了易于使用的工具,来处理预先构建的服务器运行时,来通过层缓存和压缩来实现高效的资源使用。这些功能使得不可变的基础设施变得实用,因为它们是如此的轻量级和无摩擦。


Kubernetes 在不久之后也进入了这一领域,接过这一火炬并继续朝着目标,创建了一个“云原生”原语的 API,它假定并鼓励了一种不可改变的哲学。例如,ReplicaSet 假设在我们的应用程序生命周期的任何时候,我们都可以(并且可能需要)重新部署我们的应用程序。为了平衡这一点,Pod Disruption Budgets(Pod 应急预算)将指导 Kubernetes 应用程序如何重新部署。


以上种种进步的融合使我们进入了不可改变的基础设施时代。而且随着更多的公司参与进来,这个数字还会增加。今天的工具使我们比以往更容易接受这些模式。那么,你还在等什么?


2020 年 4 月 12 日 20:39211

评论

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

Flink+Alink,当大数据遇见机器学习!

博文视点Broadview

Chia奇亚云算力挖矿系统开发成功案例丨Chia奇亚挖矿源码成品

系统开发咨询1357O98O718

国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?

Serverless Devs

Serverless 容器 云原生

【LeetCode】你能在你最喜欢的那天吃到你最喜欢的糖果吗?Java题解

HQ数字卡

算法 LeetCode 6月日更

为什么说混合云是新基建的流行架构?

博文视点Broadview

🏆未来可期,WebRTC成为实时通讯方案的行业标准

李浩宇/Alex

WebRTC 实时音视频 实时通信 6月日更 6 月日更

你的同事是你的竞争对手吗?

石云升

战略思考 职场经验 6月日更

架构实战营模块五作业

竹林七贤

C 语言面向对象的封装方式

实力程序员

LeaRun .Net Core/Java工作流引擎,分离式前端,升级Vue

雯雯写代码

Vue 工作流引擎

带你认识大模型训练关键算法:分布式训练Allreduce算法

华为云开发者社区

分布式训练 Allreduce算法 集合通信 分布式通信算法 大模型训练

我把 Spring Boot 项目从 18.18M 瘦身到 0.18M,部署起来真省事!

xcbeyond

微服务 springboot 6月日更

【译】JavaScript 代码整洁之道-异常处理篇

KooFE

JavaScript 前端 异常处理 6 月日更 整洁代码

写给想做程序员的半吊子应届毕业生们

北游学Java

Java Python 求职 秋招

书单 | 5月畅销新书情报,你最Pick哪一本?

博文视点Broadview

云上创新,阿里云视频云分享全场景音视频服务背后的场景探索与技术实践

阿里云视频云

阿里云 音视频 在线教育 视频会议 直播技术

华为云携手马栏山文创园助力湖南广电荣获国家广电总局多项大奖

华为云开发者社区

5G 视频 华为云 马栏山 AI智能剪辑

网络攻防学习笔记 Day33

穿过生命散发芬芳

网络攻防 6月日更

架构实战营 - 模块 5- 作业

carl

Tapdata 实时数据融合平台解决方案(一):现代企业数据架构及痛点

tapdata

mongodb

图表示学习+图神经网络:破解AI黑盒,揭示万物奥秘的钥匙!

博文视点Broadview

面向对象的Python编程,你需要知道这些!

华为云开发者社区

Python 面向对象 oop 面向对象编程

TCP协议

IT视界

TCP 传输协议 网络通信

一文回顾 Java 入门知识(上)

逆锋起笔

Java 后端 后端开发 javase

云网络开山之作,揭秘云上高速公路的十年技术成果!

博文视点Broadview

自适应微服务治理背后的算法

万俊峰Kevin

go golang 自适应 服务治理 微服务治理

fil云算力系统开发具体流程丨fil云算力开发源码成品

系统开发咨询1357O98O718

AT智能量化炒币机器人系统开发详解案例

系统开发咨询1357O98O718

anyRTC SDK 5月迭代:优化自定义加密功能,让通信更安全

anyRTC开发者

音视频 WebRTC sdk

毕业设计So Easy:珠穆朗玛FM音频电台APP

不脱发的程序猿

android 软件开发 APP开发 毕业设计 移动应用开发

一封MySQL之父Monty的回信,开启彭立勋的数据库之路

华为云开发者社区

MySQL 数据库 opengauss GaussDB 华为云数据库

Study Go: From Zero to Hero

Study Go: From Zero to Hero

「不可变基础设施」时代来临,你准备好了吗?-InfoQ