赛题解析 | 初赛赛道三:服务网格控制面分治体系构建

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 首届云原生编程挑战赛正在报名中,初赛共有三个赛道,本文主要针对赛道三题目做出剖析,帮助选手更高效的解题。

首届云原生编程挑战赛正在报名中,初赛共有三个赛道,题目如下:

赛道一:实现一个分布式统计和过滤的链路追踪
赛道二:实现规模化容器静态布局和动态迁移
赛道三:服务网格控制面分治体系构建

立即报名(报名时间即日起至06/29):https://tianchi.aliyun.com/specials/promotion/cloudnative#problem-definition

本文主要针对赛道三题目做出剖析,帮助选手更高效的解题。

背景知识

“服务网格” 是近年来非常火热的技术,其全托管的思维非常适合云原生场景。“服务网格” 核心分为控制面与数据面:数据面主要是一个名为 Sidecar 的代理组件,它通过接收控制面发送的路由与控制信息来定向转发或处理数据。这样一些坐落在服务网格里的应用就将整个分布式逻辑交给了底层,自己不用关心了。一旦与底层解耦,灵活性大大增加,更符合云原生的标准。

题目解析

本题的核心考查点还是如何让服务网格的控制面支撑大规模的 Sidecar 实例。为什么会产生这个问题呢?因为在目前服务网格影响最广的实现 Istio 架构中,控制平面 Pilot 负责整个系统的路由转译工作,也就是说所有服务的实例信息都需要通过 Pilot 下发给每一个 Sidecar,当然用户可以通过 SidecarScope 来设置个别 Sidecar 对于系统服务的可见性,但这只会影响到 Sidecar 接受到的数据而已,Pilot 仍然是全量从注册中心同步(例如 Consul,K8s 的 CoreDNS 等),如此一来随着接入应用的增加,Pilot 不能横向扩容,很快便会成为性能瓶颈(内存不够用啊)。

1.png

题目提出了分治的解法,而选手们的任务就是优化分治逻辑,使整体负载均衡。为了理解题目,我们首先需要弄清楚什么是分治。所谓的分治就是将负载分成一个个独立的子系统,然后分别处理他们,这样就将问题化小了,比如我们常见的合并排序,就是分治的典型应用。按题目的解释,控制面的分治是按应用维度进行划分的,也就说坐落在服务网格中的应用将被划分到不同的子系统中。

2.png

上图中,就被划分成了左右两个子系统。应用之间存在相互依赖即服务依赖,在本题中一个应用只提供一个服务,因此应用所连接的 Pilot 需要加载的数据就是其依服务。由于分治的存在,每个 Pilot 不需要加载所有的服务了,这样当更多的应用接入时,我们就可以进行横向扩容解决容量问题。

3.png

上图中为什么每个分治组加载的数据不是完全隔离的呢?这里的原因是应用的依赖是错综复杂的,如果我们把每个应用一个点表示,依赖用一条线表示,那么实际生产中,几乎是不可能形成孤岛的,原因是:每个应用依赖的服务是有重叠的,而且很多。

这样我们便不能随意地划分应用,因为如果我们将依赖相似度很高的应用划分到不同的 Pilot 上,会导致同样的依赖在多个 Pilot 上加载,造成内存消耗增加。反过来,如果将所有应用都挂到同一个 Pilot 上,那么加载的内存总量是最少的,不过连接就极度不均匀了。

所以本题要求选手优化分治逻辑,让分治系统均匀承压。我们先来看看一评分的公式:
4.png

公式也不复杂,分为三个评分项:

  1. Pilot 实际加载内存与理想内存的占比,上文提到,不同应用之间依赖的服务可能会有重叠,因此最理想的状态就是所有服务依赖在整个 Pilot 系统中只加载一次,简单来说就是将有相似依赖的应用都划分到同一个 Pilot 中;
  2. Pilot 的内存标准差,这个就比较直白了,就是让 Pilot 加载的服务尽量均衡,不要出现一个 Pilot 加载很多数据,另一个空闲的状态;
  3. Pilot 连接的标准差,这个与上面的类似,就是要求 Pilot 连接的 Sidecar 尽量均衡。

由于实际加载的内存肯定是大于等于理想状态内存,因此最左边的分子式始终于大于 1 的,也就是说,这是一个倍率;而标准差是大于等于 0 的,显然想要两个标准差同时为 0 不现实。因此选手的任务就是分配应用,让

  1. 每个 Pilot 加载的服务数相近;
  2. 每个 Pilot 连接的 Sidecar 相近;
  3. 尽量不要重复加载服务。

什么意思呢,既然我们已经知道了分治就是让应用连接不同的 Pilot ,那么每个应用连接上 Pilot 后便会给其一定的压力。

连接的应用越多,压力越大,但由于服务存在重叠的现象,因此并不完全是线性关系。例如上图中另一个应用 E 连 接上来后,如果其依赖的服务是 [服务A,服务B,服务E],那么 Pilot 加载的服务仅会增长 1。这就很好的节省了内存开销。

因此,如何分配应用至每个 Pilot 上,使其满足公式所示条件,就是本题的操作空间与需要解决的问题。

需要特别注意的是,本题评分分为了 两个阶段,一个是静态的,选手可以一次性拿到一阶段所有数据,这样我们就可以整体分析。二阶段数据都是实时分批给的,因此如何让动态的数据也具备良好的表现亦是解题的一个关键点。另外还需要注意的一点,Pilot 加载的数据是只境不减的,因为在实际生产环境中,不可能将一个应用瞬间迁移到另一个 Pilot 上,因此已有的数据需要保留。

解题思路

既然我们知道了得分的要点,那我们就可以围绕这三个点来优化。以下给大家一些分析,以供解题。当然解法很多,下面只是一个列举。

仅量不要重复加载服务数据

当然是让依赖相同的应用出现在同一个 Pilot 上,因此我们可以分析应用依赖的相似度,把相似度高的应用归组一起分配。因为依赖是一个列表,我们可以将其视为一个基因片段或者字符串中的一个字符,问题便成了如何在海量字符串中找到相似的。

Pilot 连接的 Sidecar 相近

当然是每个 Pilot 都一样为好,理想状态是均分。平均说到是简单,但是我们可不能像切蛋糕那样做呀。每个应用的实例有大有小,那么这里的问题就化为了有一串物品,N 个包他们的价值为 a1, a2, a3……,我们如何放置才能使每个包里物品的价值接近平均值,虽然我们有两个要求相近的值(内存与连接),不过如果我们再把物品的重量考虑进来,参数维度就增加了。

第二阶段动态部分

由于第二阶段的数据是不能一次性得到的,因此如何利用已有的数据便成了关键,这里一个方向是类似基于已排序数列进行插入再排序的思想,如何构造这样的一个状态便是关键。

如何拿好成绩

由于得分公式是一个整体,单单提升一个是得不到好成绩的,因此要想拿好结果,建模是需要的,这样我们才能知道哪个才是最大的影响因子,或者甚至能够消除一个变量,那就更好了。

以上内容来自赛道三的明星导师玄胤。

作者信息:
玄胤,阿里云高级技术专家,8 年专注软负载领域,从 0 到 1 写过服务百万实例的软负载产品,Nacos 奠基人,《Service Mesh 实战》作者,Istio 社区成员,3项国家发明专利。

挑战赛交流群

报名成功后,一定要记得加入咱们的挑战赛交流群哦~

首届云原生编程挑战赛选手交流群(钉钉群):

QzpcVXNlcnNcd2Itd3h5NTg0MzIzXEFwcERhdGFcUm9hbWluZ1xEaW5nVGFsa1w2ODY4MzMyNzFfdjJcSW1hZ2VGaWxlc1wxNTkwMTE3NzgzNDIwX0U4REE5MTMzLTY5NEMtNDliNS1CQkQyLTUxN0M2Mjc4MzkyQy5wbmc=.png

领取通关秘笈:关注“阿里巴巴中间件”公众号,回复:2020,获取大赛玩法解析(包含参赛玩法和奇葩任务的玩法)。

相关文章
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
11月前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
512 76
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
存储 人工智能 程序员
通义灵码AI程序员实战:从零构建Python记账本应用的开发全解析
本文通过开发Python记账本应用的真实案例,展示通义灵码AI程序员2.0的代码生成能力。从需求分析到功能实现、界面升级及测试覆盖,AI程序员展现了需求转化、技术选型、测试驱动和代码可维护性等核心价值。文中详细解析了如何使用Python标准库和tkinter库实现命令行及图形化界面,并生成单元测试用例,确保应用的稳定性和可维护性。尽管AI工具显著提升开发效率,但用户仍需具备编程基础以进行调试和优化。
626 9
|
9月前
|
云安全 人工智能 安全
阿里云网络安全体系解析:如何构建数字时代的"安全盾牌"
在数字经济时代,阿里云作为亚太地区最大的云服务提供商,构建了行业领先的网络安全体系。本文解析其网络安全架构的三大核心维度:基础架构安全、核心技术防护和安全管理体系。通过技术创新与体系化防御,阿里云为企业数字化转型提供坚实的安全屏障,确保数据安全与业务连续性。案例显示,某金融客户借助阿里云成功拦截3200万次攻击,降低运维成本40%,响应时间缩短至8分钟。未来,阿里云将继续推进自适应安全架构,助力企业提升核心竞争力。
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
328 52
|
11月前
|
缓存 Kubernetes 容灾
如何基于服务网格构建高可用架构
分享如何利用服务网格构建更强更全面的高可用架构
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
监控 持续交付 数据库
构建高效的后端服务:微服务架构的深度解析
在现代软件开发中,微服务架构已成为提升系统可扩展性、灵活性和维护性的关键。本文深入探讨了微服务架构的核心概念、设计原则和最佳实践,通过案例分析展示了如何在实际项目中有效地实施微服务策略,以及面临的挑战和解决方案。文章旨在为开发者提供一套完整的指导框架,帮助他们构建出更加高效、稳定的后端服务。
|
Kubernetes Cloud Native JavaScript
为使用WebSocket构建的双向通信应用带来基于服务网格的全链路灰度
介绍如何使用为基于WebSocket的云原生应用构建全链路灰度方案。

热门文章

最新文章

相关产品

  • 服务网格
  • 推荐镜像

    更多
  • DNS