【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

配置即代码:先有鸡还是先有蛋

  • 2021-01-06
  • 本文字数:2860 字

    阅读完需:约 9 分钟

配置即代码:先有鸡还是先有蛋

我们来编个故事。


咕咕哒公司是一家新型数字化养鸡场企业。养鸡场使用基础设施即代码的理念。操控流水线完全自动化构建和部署新的养鸡场及更新旧养鸡场。这一举措致使公司可以统一管理旗下养鸡场,生产的鸡蛋质量统一,部署过程完全自动化,无人化,极大的避免了人为错误。目前公司业务进展顺利,开始全面开始拓展市场。

事件


因为不同地域的气候特征以及饲料供应链差异,公司发现使用同一种品种已无法满足适应市场拓展的需求。于是公司决定使用在不同地区饲养适应该地区的特殊品种。这些地域性的配置一开始是作为参数被各地区在基础设施构建后,以手动复写配置文件的方式独立管理的,在实际的应用过程中产生了几个问题:


  1. 配置分散:自动化构建生成的基础设施相关配置(如数据库连接串)由基础设施脚本管理,而地域性配置由当地环境线上部署文件管理,总部不可控。

  2. 配置不可见:一个地域的配置需要下载这个地域线上的配置文件才能知道这个地域环境的配置是什么。

  3. 配置无唯一可信源:自动化构建生成的配置可被区域性配置复写,省级配置可被市级配置复写。最终环境上一项配置是由谁配的,被谁复写过,为什么最终是这个配置无法溯源。

  4. 配置修改门槛高:因为修改或增加配置需要复写线上部署文件,需要了解底层部署原理才能进行操作。这个任务往往最终转变成 DevOps 的任务,给 DevOps 带来了不必要的负担。而且人为错误可能性大幅提升。


为保证不影响作为公司核心竞争力的自动构建和自动部署。公司决定在基础设施构建过程中引入使用配置即代码的配种(配置)中心来解决上述问题,集中并自动化管理配置。

争议


是先有配置中心(🐔鸡)还是先有基础设施及代码(🥚蛋)?如果先有配置中心,那配置中心又是如何构建出来的?如果先有基础设施及代码,那配置其实是由基础设施及代码来管理吗?


方案一:先有配置中心


配置中心管理所有配置并独立于基础设施及代码之上存在。



(图一)



(图二)

方案一的实现


  1. 在原有的养鸡场基础设施即代码之外新增一个配置中心。这个配置中心可以是在运行养鸡场构建之前手动创建的,或(如图二)由另一套基础设施及代码脚本独立构建的。

  2. 配置中心里保存养鸡场基础设施及代码的所有通用配置(包含基础设施参数和业务配置),各区域管理人员统一在总部这个唯一的配置中心里添加自己区域的特殊配置(包含特殊的基础设施参数和业务配置)。

  3. 在构建基础设施时由配置中心中所有带有基础设施标签的配置生成配置文件用于构建。

  4. 养鸡场直接连接配置中心(或连接中央配置中心的只读副本)并获得所有适用于改地域的业务配置。

讨论


  1. 问:是否坚持遵循基础设施即代码?

  2. 答:应该,否则无法使用流水线自动化构建。

  3. 问:是否引入配置即代码?

  4. 答:应该,因为上一个问题决定了这个配置中心应该可以自动被构建,所以配置也要在构建过程中写入。

结果


需要拆出(如图二)的第二套基础设施即代码。

优势


  1. 基础设施配置与业务配置在同一地点集中管理。

  2. 利用配置中心 UI 展示配置,所见即所得。标签区分基础设施 vs. 业务,通用 vs. 地域等。至多一次复写。

  3. 配置中心即为唯一可信源,方便公司可以统一管理。

  4. 利用配置中心 UI 维护配置简单方便。

劣势


  1. 配置中心成为基础设施构建部署整套流程的单点故障。

  2. 配置中心引入与养鸡场基础设施生命周期不同的基础设施,破坏基础设施即代码的完整性。

  3. 讨论结果导致最终方案需要实现了方案一与方案二的混合策略。这引入了方案二的所有缺点,直接破环了这个设计的初衷。


方案二:先有基础设施及代码


配置中心只管理所有业务配置,并由基础设施及代码(配置即代码)管理。



(图三)

实现


  1. 在原有的养鸡场基础设施即代码中加入一个配置中心的构建模块。

  2. 公司集中为每一个地域管理一套配置即代码(包括基础设施的参数与业务配置),并在这个地域的基础设施构建时将业务配置写入为这个地域构建的配置中心中。

  3. 养鸡场直接连接配置中心获取业务配置。

讨论


  1. 问:如果通过手动修改配置中心的方式改变业务配置,会不会导致配置即代码不可信?

  2. 答:会,配置即代码并不能代表线上环境真实使用的配置。

  3. 问:配置即代码是不是应只管理业务配置的初始值?

  4. 答:不,基础设施即代码或配置即代码修改后应用时会覆盖修改过的配置。

结果


引入“业务修改配置后应相应修改配套配置即代码”规则。

优势


  1. 基础设施配置与业务配置在同一地点集中管理,并原生遵循配置即代码。

  2. 利用配置中心 UI 展示业务配置,所见即所得。没有复写。基础设施参数与业务配置相隔离,可以只由 DevOps 管理。

  3. 配置即代码为唯一可信源,方便公司统一管理。

  4. 修改配置即代码相对与修改线上部署降低了修改配置的门槛。

劣势


  1. 引入的规则导致配置新增或修改后需要修改配置即代码,相比方案一维护门槛上升。

  2. 如果规则执行力度不够,也会直接破环可信度。

  3. 引入的规则导致配置中心不能直接用来管理配置,UI 只用做配置展示,配置中心成为鸡肋。


实操迭代:分离基础设施配置和应用配置


分治基础设施配置和应用(业务)配置。应用配置使用方案一,基础设施配置使用方案二。



(图四)

实现


  1. 在原有的养鸡场基础设施即代码中加入两个配置中心的构建模块。

  2. 公司集中为每一个地域管理一套配置即代码(只包括基础设施的参数)和一套含有默认业务配置的脚本。在这个地域的基础设施构建时,将基础设施配置的实际值和业务配置的默认值分别写入为这个地域构建的两个配置中心中。

  3. 地域管理者在基础设施构建完成后自行修改并确认业务配置后开始运作。

  4. 养鸡场连接基础设施配置中心获得如数据库连接串等在基础设施构建时生成的配置,并连接应用配置中心获得如缓存时间等业务配置。

优势


  1. 基础设施配置与业务配置各自在同一地点集中管理,基础设施配置原生遵循配置即代码。

  2. 利用配置中心 UI 展示业务配置,所见即所得。没有复写。

  3. 基础设施配置即代码即为唯一可信源,方便公司可以统一管理。

  4. 基础设施参数与业务配置完全隔离。

  5. 区域业务配置中心为该区域唯一可信源,方便该区域统一管理。

  6. 区域业务配置可以直接利用配置中心 UI 维护配置简单方便。

劣势


  1. 业务配置不遵循配置即代码,要求上线前由区域业务人员手工确认配 置。

  2. 公司无法集中管理业务配置,仅限管理业务配置的默认值。

  3. 两套配置中心,增加成本和维护复杂度。

结语


虽然文章的最后提出了我们在实际项目中经过筛选和迭代后实操的方案,但这一方案也并没有完美的解决配置即代码的鸡生蛋蛋生鸡的问题。反而相比于方案二,迭代方案在业务配置上对配置即代码的管理方式做出了让步,从而去除了强制业务使用代码管理配置的门槛。


方案一是认定先有鸡(配置中心),而对第一只鸡从哪里来做出了让步(手工创建)。方案二则推崇绝对的现有蛋(代码),放弃了鸡生蛋的循环,只能通过修改蛋产生变化。最终的方案,融合两者,在需要绝对控制而不易变化的基础设施配置上使用方案二保证自动化,而在需要便捷和变化的业务配置上使用方案一保证可用性。


做出让步可能是现阶段让我们走出鸡生蛋蛋生鸡这个死胡同的最好的办法,而做出什么让步,则取决于项目的价值优先级。最重要的,是利用 DevOps 的理念,在不引入新的痛点的基础上,最大限度的解决我们现有的痛点。


文章转载自: ThoughtWorks 洞见(ID:TW-Insights)

原文链接:配置即代码:先有鸡还是先有蛋

2021-01-06 07:001448

评论

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

这可能是今年最值得入手的一本思维导图书

博文视点Broadview

算法喜刷刷之1021删除最外层的括号

Kylin

算法 28天写作 3月日更 21天挑战

php in_array的低性能

架构精进之路

php 3月日更

飞桨刷新分子性质预测榜单,助力AI药物研发

百度大脑

百度 AI 飞桨

孤寡程序猿找女朋友的方法论

不脱发的程序猿

程序员 找对象 28天写作 3月日更 脱单

智慧物流迎利好,当代电商倒逼传统产业链变革升级

一只数据鲸鱼

物联网 数据可视化 供应链 智慧城市 智慧物流

【LeetCode】翻转链表Java题解

Albert

算法 LeetCode 28天写作 3月日更

SD-RTN——毫秒级网络加速带来全新的体验

anyRTC开发者

android 5G 音视频 WebRTC RTC

NA公链双重隐私技术为NAC公链护航涅磐

区块链第一资讯

区块链 公链 挖矿

有道精品课实时数据中台建设实践

有道技术团队

大数据

EGG公链——ETFalk开启了新一代去中心化社交革命

币圈那点事

高效使用Chrome浏览器,你可能不知道的10个技巧。

彭宏豪95

chrome 效率 浏览器 使用技巧

比电脑屏保还酷?在电脑桌面实时显示当前时间。

彭宏豪95

效率 效率工具 时间 应用 桌面时钟

Github上2021最新最全面的面试题库(Java岗)程序员不容错过

比伯

Java 编程 程序员 架构 面试

万象:百度的海量多媒体信息处理系统

百度开发者中心

#富媒体# #信息系统#

智汇华云 | ArcherOS Stack共享存储虚拟化技术剖析

华云数据

Linkis 1.0.0-RC1 版本发布

康月牙

高斯 Redis 在IM场景中的应用

华为云开发者联盟

数据库 IM 华为云 GaussDB(for Redis)

都在讲Redis主从复制原理,我来讲实践总结

华为云开发者联盟

数据库 redis 复制 服务器 非关系型数据库

数仓集群管理:单节点故障RTO机制分析

华为云开发者联盟

GaussDB 集群 GaussDB(DWS) RTO 单节点故障

告别交通拥堵和数据孤岛,区块链成智慧交通发展新基石

旺链科技

区块链应用 智慧交通

详解 ZooKeeper 数据持久化

HelloGitHub

Java zookeeper ZooKeeper原理

zookeeper的数据模型详解

大数据技术指南

大数据 zookeeper 28天写作 3月日更

鲸品堂开篇

鲸品堂

行业资讯 通信 科技

京东M-PaaS平台之Android组件化系统私有化部署改造实践

京东科技开发者

系统架构 mPaaS

化蛹成蝶,华为云DevCloud助力互联网+转型,重构钢铁产业链

华为云开发者联盟

Scrum 代码 华为云 devcloud 敏捷管理

《Redis 核心技术与实战》学习笔记 03

escray

redis 学习 28天写作 3月日更 Redis 核心技术与实战

JDBC—配置SQLyog

打工人!

MySQL JDBC SQLyog

《Out of Tar Pit》总结

陈皓07

JDBC—连接数据库工具类(JDBC_Utils)

打工人!

Java JDBC java工具类 操作数据库

B2B 产品市场中「价值营销」的 8 个关键词

To B Park

配置即代码:先有鸡还是先有蛋_文化 & 方法_张凯峰_InfoQ精选文章