写点什么

微服务——版本组合爆炸!

  • 2020-03-22
  • 本文字数:2011 字

    阅读完需:约 7 分钟

微服务——版本组合爆炸!

随着 IT 领域向微服务的转变,以及诸如 Kubernetes 之类工具的蓬勃发展,一个挥之不去的问题开始慢慢地全面显露出来。这就是各种微服务版本的组合爆炸(Combinatorial Explosion of versions)。社区的期望是,它至少要比以前的依赖地狱(dependency hell)好一些。但尽管如此,对基于微服务的产品进行版本控制仍然是一个相当困难的问题。为了证明这一点,像《把我的单体应用还给我》这样的文章会立刻浮现在脑海中。



组件版本的组合爆炸


让我来给你解释一下这是怎么回事吧。假设我们的产品由 10 个微服务组成。现在假设每个微服务都有一个新版本。只有一个版本(这是我们都清楚的,这听起来很微不足道)。现在回过头来看下我们的产品。每个组件只有一个新版本,那么我们现在就有 2^10 种组合,即可以对我们的产品进行 1024 种排列组合。


如果还没有完全弄清楚,让我用数学解释一下吧。我们有 10 个微服务,每个都有一个更新。因此,每个微服务都有两个可能的版本(旧版本或更新后的版本)。现在,对于每个组件,我们可以使用这两个版本中的任何一个。这相当于一个有 10 位的二进制数。例如。假设 1 代表新版本,0 代表旧版本,所以,在只更新第 1 个和第 4 个组件其他组件无更新的情况下,会得到一个排列 1001000000。利用数学,我们知道 10 位的二进制数有 2^10 或 1024 种变化。这正是我们要处理的数字。


现在,继续我们的思考。假设我们有 100 个微服务和 10 个可能的版本,又会怎样呢?整个事情会变得很糟糕。它将是 10^100 个排列组合,这是一个很大的数字。对我来说,这样很好,因为现在我们不是躲在“kubernetes”这样的字眼后面,而是要面对这个棘手的问题。


为什么我对这个问题如此着迷呢?部分原因来自 NLP/AI 领域,我们在 5-6 年前就已经在积极讨论这个领域的组合爆炸问题了。我们只是用不同的词代替了版本,用句子和段落代替了产品。现在,虽然 NLP 和 AI 的问题基本上还没有解决,但事实上,最近已经取得了实质性的进展(对我来说,如果人们对机器学习不再那么痴迷,对其他技术考虑得更多一些,进展可能会更快一些,但这是题外话)。


现在,回到容器和微服务的 DevOps 领域。我们面临着一个巨大的问题,我经常会听到:只要使用 kubernetes 和 helm,一切都会好起来的。你猜怎么着,光靠自己是不行的。更重要的是,封闭式地解决这类问题是行不通的。就像在 NLP 中一样,我们首先应该通过限制搜索空间来解决这个问题,即修剪过时的排列。


”修剪过时的排列“对此很有帮助,我去年在这篇“生产中需要维持最小版本跨度”博客中也提到过。此外,值得注意的是,良好的 CI/CD 过程对修剪变化也有很大的帮助。但是,如果没有适当的核算、跟踪和工具来处理组件的实际排列,CI/CD 的当前状态是不够的。


我们需要更大规模的集成阶段实验,在那里我们可以建立每个组件的风险因素,通过自动化的过程来升级不同的组件,并在没有人为干预的情况下进行测试,看看哪些组件是有效的,哪些是无效的。


所以这个系统应该是这样的:


  1. 开发人员编写测试(这一点至关重要,否则就没有参考点了,它就像是在 ML 中标记数据一样)

  2. 每个组件(项目)都有自己定义良好的 CI 管道,到目前为止,这一过程已经被很好地建立了,每个组件的 CI 问题基本上已经基本解决了

  3. “智能集成引擎”位于各种 CI 管道的顶部,将组件项目组装到最终的产品中,运行测试,并在给定当前组件的情况下找出完成功能所需的最短路径,并计算风险因素。如果不能进行升级,引擎就会向开发人员发出警告,告诉他们最佳候选对象是什么以及是哪些地方导致地失败。同样,测试也是至关重要的,集成引擎会使用测试作为参考点。

  4. 然后,CD 管道从智能集成引擎中提取数据并执行实际的发布。这样就完成了整个循环流程。


总之,对我来说,目前最大的困难之一是缺少一个集成引擎,该引擎可以将各种组件组合到产品中,从而可以对整个产品的实际工作方式进行适当的跟踪。如果你能提出这方面的想法建议,我会很感激的(剧透下,我目前正在Reliza上开发“智能集成引擎”。)


最后我想说的是,对我来说,“单体”(monolith)并不是任何大型项目的最终答案。因此,我非常怀疑是否真的有人试图通过回到“单体”来改善交付周期和交付质量。首先,”单体“在不同库之间存在类似的依赖管理问题,只是它在很大程度上被隐藏在开发阶段了。因此,人们无法真正地在“单体”上做出任何改变,所以整个过程都会慢如蜗牛。


微服务使事情变得更好了,只是随后它们在集成阶段遭遇了版本控制的爆炸。是的,本质上,我们是将同样的问题从开发阶段转移到了集成阶段。但是,在我看来,它仍然是变得更好的,团队使用微服务后实际上运行地更快了(可能只是因为批处理的规模更小)。尽管如此,到目前为止,我们通过将“单体”分解为“微服务”所取得的进步还远远不够,组件的版本爆炸是一个巨大的问题,我们还有很大的潜力使事情变得更好。


请链接到HN进行讨论。


原文链接:


Microservices – Combinatorial Explosion of Versions


2020-03-22 09:002371

评论

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

拥有一个高性能低延时数据库是什么样的体验?

华为云开发者联盟

数据库 华为云 GaussDB GaussDB(for Cassandra) 低延时

云原生的进一步具象化

阿里巴巴云原生

大数据 容器 云原生 监控 中间件

阿里P7:每个码农都应该知道的MySQL主从复制方法,看这篇就够了

牛哄哄的java大师

Java MySQL 数据库

如何下载和保存YouTube上的中英双语字幕和视频

flyfk

字幕

5月20日,GaussDB将有大事发生

华为云开发者联盟

数据库 云原生 华为云 GaussDB TechWave

云厂商下一块必争之地就是它了!

Serverless Devs

Serverless 云原生

凭借师兄甩给我的通关秘籍,顺利拿到字节Offer

学Java关注我

Java 编程 架构 面试

一千座5G工厂的花苞

脑极体

被解救的代码 - 代码即服务时代来了!

Serverless Devs

阿里云 Serverless 云原生

前端项目上传图片,压缩,拍照图片旋转解决方案

Vue js canvas axios

实战排查由于系统负载引起的服务响应异常

Coder的技术之路

高并发 性能调优 线上问题

来了!这份阿里P7大佬梳理的Java注解和反射精髓笔记,信息量过大

飞飞JAva

Java

从SPACE矩阵,看5G究竟是否在走向成功?

脑极体

差点扛不住了,阿里巴巴支付宝面试 5 轮暴击,终获 Offer

Java架构师迁哥

强!上线3天获10w浏览量,京东T8纯手码Redis缓存手册,我粉了

飞飞JAva

redis

python解释器+pycharm的安装

Geek_6370d5

#python学习之路

消除数据孤岛,华为云DRS让一汽红旗ERP系统数据活起来

华为云开发者联盟

数据库 GaussDB 数据孤岛 华为云DRS ERP

☕【Java技术之旅】如何彻底认识AQS的原理(上篇)

码界西柚

Java AQS JVM JUC 5月日更

王兴的失败观

池建强

成功 王兴 创业失败启示录

工业制造业亟需数字化转型,区块链可以发挥哪些价值?

CECBC

区块链

GitHub霸屏文章!清华教授手写保姆级笔记Scala - 类,网友:太香了

牛哄哄的java大师

Java scala

300条数据变更引发的血案-记某十亿级核心mongodb集群部分请求不可用故障踩坑记

杨亚洲腾讯科技

数据库 mongodb 架构 MySQ 分布式数据库mongodb

高德 Serverless 平台建设及实践

Serverless Devs

阿里云 Serverless 云原生

云原生下的灰度体系建设

阿里巴巴云原生

容器 运维 云原生 k8s 监控

阿里P7大佬!王者级讲解ConcurrentHashMap源码,码农:太透彻了

牛哄哄的java大师

Java ConcurrentHashMap

太赞了!美团大牛强推的Spring事务笔记,上线仅1天就获赞上万

飞飞JAva

Java 事务spring

重磅!数字人民币接入支付宝!

CECBC

数字人民币

消息队列的两种模式

五分钟学大数据

kafka 5月日更

Apache Hue介绍

大数据技术指南

hue 5月日更

异步编程的几种方式,你知道几种?

xcbeyond

Java 异步编程 5月日更

Nginx如何配置Http、Https、WS、WSS?

冰河

nginx 负载均衡 反向代理 https HTTP

微服务——版本组合爆炸!_软件工程_taleodor_InfoQ精选文章