蚂蚁 SOFAServerless 微服务新架构的探索与实践

69fe18c7b2328af4902219ca2ce2aea8.gif

赵真灵(有济)

蚂蚁集团技术专家

Serverless 和微服务领域专家

曾负责基于 K8s Deployment 的应用发布运维平台建设、K8s 集群的 Node/pod 多级弹性伸缩与产品建设。当前主要负责应用架构演进和 Serverless 相关工作。同时也是 SOFAArk 社区的开发和维护者以及 KNative 社区的贡献者。

本文  3612  字,预计阅读  12  分钟

传统微服务架构面临的

问题和挑战?

应用架构从单体应用发展到微服务,结合软件工程从瀑布模式到当前的 DevOps 模式的发展,解决了可扩展、分布式、分工协作等问题,为企业提供较好的敏捷性与执行效率,给企业带来了明显的价值。但该模式发展至今,虽然解决了一些问题,也有微服务自身的问题慢慢暴露出来,在当前已经得到持续关注:

1、业务开发者需要感知复杂的基础设施,启动慢(分钟级),研发效率低,运维负担重

c1f7b4c4234d1a860da98562a3cc4531.png

对于基础设施的问题,在服务网格和应用运行时的工作已经取得了一定的成果,但是基础设施到业务开发之间还存在业务通用的部分,这里当前没有一个模式来给予支持。

当前已经有一些开源项目在尝试解决基础设施的问题,例如服务网格、应用运行时,如 Dapr/Layotto,也都在实际应用中得到了不错的效果。但当前服务网格和应用运行时更多的是将中间件以下下沉到 sidecar,而一个应用一般还包括通用的业务逻辑部分,要让更广泛的业务也能享受到无基础设施的体感,也需要让业务以下(可以把业务层以下的看作基础设施)都能屏蔽。另外当前对于中小企业来说,使用服务网格和应用运行时的成本还是比较高的。

98e03c37b5513d7547aa730d79f363dd.png

2、拆分微服务的资源与维护成本高

拆分后每个子应用都包含公共部分(框架、中间件等),除了同样存在上述第一个问题之外,还需要独占机器资源成本高,如果部分业务萎缩,会面临长尾应用问题,需要承担长期维护的成本。

768364049d4df17b0b2f87a1d33eceb7.png

3、拆分微服务的敏捷度与业务、组织发展的敏捷度不一致,导致如何合理地拆分微服务始终是个老大难的问题

  • 拆得多增加了资源和管理成本;

  • 拆得不够造成协作效率问题。有些是应该拆但没拆,有些是因为业务领域已经较为细分不便再拆,特别在一些中小企业里,可能都没有微服务的配套设施。

蚂蚁的解决思路和方案

为了解决这些问题,我们对应用同时做了横向和纵向的拆分。纵向拆分:把应用拆分成基座模块两层,这两层分别对应两层的组织分工。基座小组与传统应用一样,负责机器维护、通用逻辑沉淀、模块架构治理,并为模块提供运行资源和环境。模块在业务层以下所有的基础设施、应用框架、中间件可以不再关注,聚焦在业务逻辑研发本身;并且采用 jar 包的研发模式,具备秒级的验证能力,让模块开发得到极致的提效。

6c225a7bb77001a342974efdf186a8cf.png

这可以理解为这套架构的核心模型,核心的能力有两个:平台化 + 模块化。模块化是 20 年前 OSGI 就已经提出的概念,从 OSGI 到 JPMS 一直未被抛弃,到最近 Spring Modulith、Service Weaver 等行业里又兴起一些开源框架,它一直在发展;平台化从 2017 年出现在技术雷达到 2023 年被 Gartner 列为十大战略趋势之一,到现在国内的平台工程,不断得到重视和发展。而我们实际上在行业还没有对这两个技术方向充分关注的情况下,就在尝试把他们结合起来,并在蚂蚁内部得到规模化验证和落地,给业务带来极致的降本增效效果。

该模式的另一个特点是可演进、可回滚。这里的模块随着业务发展壮大,可以独立部署成微服务;如果微服务拆分过多,可以低成本改造成模块,合并部署在一起,解决资源成本和长期维护成本。实际上可以理解为我们是在单体应用架构和传统微服务架构中间,增加了一个可以演进过渡的架构。

f5d8fcf6a43caa9610d5f8626cf99156.png

总结下来这套新微服务架构可以解决这四个问题:

1、横向拆分出基座屏蔽业务以下的基础设施、框架、中间件和业务通用逻辑等部分,从而极大降低了业务开发者的认知负荷、提高了开发效率。

2、一个应用可以低成本改造或拆分出多个模块,模块间可以并行独立迭代,从而解决了多人协作阻塞问题,每个模块不单独占用机器资源,没有拆分的机器成本问题。

3、存量微服务如果拆分过多,可以低成本改造成模块应用,合并部署在一起,解决拆分过多带来的资源成本和维护成本痛点。

4、模块可以灵活部署,解决微服务拆分与组织发展灵敏度不一致导致的协作低效与分工不合理问题。应用拆分出多个模块,可以部署在一起,也可以进一步演进成独立微服务,同样如果微服务拆分过多,也可以低成本改回模块合并部署到一起。

这里卖个关子——为什么这些技术在蚂蚁能规模化落地?存量的业务 owner 在业务迭代进度和升级新架构之间做权衡时,我们做了哪些工作?欢迎来到 9 月 3 号 QCon 大会现场获得更详细的信息。

532d241283213404a252ee795dadfa9b.png

在采用新的微服务架构模式后的成果

举个当前蚂蚁实际业务采用新模式前后的对比数据:

7d16a2fffe6b7eded683617e3d0296f9.png

可以看到这些数据是十倍级以上的提升,当前蚂蚁所有 BU 都已经接入,将近 40W core 的在线业务,并为两种业务模式:中台模式和轻应用模式的业务都提供秒级研发运维的能力。一个基座上面最多有上百个模块,一个开发同学在研发验证阶段,一下午可以验证上百次,需求的交付效率最快可以到小时级别。

在当下行情下,新技术落地的挑战

与蚂蚁的思路

当前行情下,企业对新技术会更加谨慎,技术人也对新技术采取保守态度。新技术虽然很酷,但投入大落地场景有限。这其实是发展过程的转换,在高速发展的行情下,一方面是历史包袱少,另一方面是乐观态度占据主导,更加相信新技术能较快得到规模化落地,整个社会都对新技术充满热情。而在当下阶段,很多企业已经有一定的历史包袱,时间证明新技术规模化落地需要很长的周期,需要整个体系一起演进才可能达到最初的预想,可能也会带来越来越繁复的基础设施,所以当前行业对新技术更加偏保守也是非常合理的。

所以蚂蚁在建设这套微服务新架构时,有一个非常关键的设计思路,那就是要接地气或者是可演进,也即是要让存量业务能低成本接入。这也是最初蚂蚁在落地该模式时踩过的最大的坑:一个普通应用转换成基座需要花费上月时间(包括流量迁移),模块研发与现有基础设施不匹配导致模块研发成本也很高,这个问题在当时也影响了该模式的生死存亡。后来蚂蚁在这块上投入了很大精力,最终让普通应用在小时内可以成为基座或模块,研发模式也与普通应用基本一致。

经过这个过程,最终低成本、可演进也成为了该模式的一个核心优势。未来对外开源,我们会把接地气做得更加彻底,不对企业的基础设施程度有预设条件:

  • 无需容器化也可以接入;

  • 无需使用 K8s 平台也可接入;

  • 无需具备微服务配套设施可也接入;

  • 无需服务网格化也可接入。

5ab6a65df7445d4a78e6e7ec93178380.png

微服务新架构落地实战中遇到的

更具体的困难和挑战

我们做的这套模式在行业内没有先例,相当于是在无人区里摸索,因此面临多方面的挑战:

1、关于模块化技术的质疑:为什么现在模块化技术又开始被关注?为什么我们基于 SOFAArk 的模块化技术能推广?挑战主要集中在如何制定合理的隔离和共享通信策略,我们需要避免 OSGI 之类的复杂度问题,做到可以低成本使用。

2、模块化技术采用了多 ClassLoader,对于 ClassLoader 的隔离、卸载不干净等问题,我们一步一个脚印,深入并体系化分析底层问题,制定各种问题的解法,需要用实际效果证明多 ClassLoader 的问题对业务的影响能否控制在可控可接受范围内。

3、不同于传统应用发布运维调度是建立在机器维度上的,我们在机器维度之上做了三层运维调度。这里成熟的配套能力需要多团队协作共同推动建设:运维能力、机器分组、流量分组调拨、监控、日志、trace、风险防御等都有全新的建设,而这些在蚂蚁现有的技术体系里,与现有的基础设施不匹配,有很多的适配改造、多团队协作推动工作。

4、存量业务在快速迭代的压力下为何会选择接入这套新的模式?做到低成本是影响用户是否愿意接入的关键。我们在低成本上做了大量工作:基座的改造、存量的应用改造成模块、存量的应用拆分成多个模块等。

5、这套模式对业务应用的分层,需要业务方团队的配合调整,其中的用户心智培养和宣讲,需要有一个过程。

总结蚂蚁落地该模式的经验和启示,

以及未来微服务领域的发展趋势和展望

一个新的模式不是一蹴而就的,更不是一夜之间就提出的。新模式的出现一般是在前人探索的基础上,用新的思路方法,保持解决问题的初心坚持下去,最终慢慢成型的。

  • 当前在解决基础设施屏蔽上,从 Docker 到 Kubernetes 到 sidecar 到应用运行时等方向在发展,这里更多是从底层向上层的发展。而我们实际上可以从另一个方向,也就是自上而下地来考虑建设,我们直接从应用这层做了纵向的拆分,把业务以下的所有部分打包成基座这层,基座及以下的所有基础设施也就直接对业务开发者屏蔽了。所以相同问题,从不同角度出发可以有新的方法,得到新的效果。

  • 3 年前的时候还没有那么多对微服务反思的声音,也还没有应用运行时(Dapr)的概念,对模块化技术也更多的是不看好;我们做的事情在行业里没有前人的指引。但我们依旧紧盯业务痛点,也并没有因为困难而采取妥协的策略,比如一个基座上只允许一个模块、一个模块只能使用 SPI 模式。我们实际上走了一条最难的路线,更多的是靠一群人的坚持、业务的理解和认可、组织的包容,才最终在蚂蚁得到规模化的落地。

当前应用的架构,有两个方向的发展:纵向不断地把业务以下的逻辑和依赖下沉,横向不断地往更细粒度的方向发展。未来 Serverless 会有多种形态,但也是在这两个方向上的发展,例如 BaaS + FaaS 模式。但是存量应用如何使用上这套模式,一直是这个行业里的问题,这个问题既是挑战,也是行业里的机会。我们需要一套能让应用平滑、逐步演进到未来 Serverless 形态的应用架构和平台能力。

软件架构好比建造一座大厦,是一层一层的沉淀稳定、一层一层的建设。观察 Kubernetes 资源编排这层已经成熟,当前领域里更多是在做 mesh/微服务这层,当这一层未来也成熟稳定时,相信也会出现几个类似 Kubernetes 的产品,这是我们当前的机会,当然其中也充满了挑战。

今年我们会把我们这套能力对外开源,欢迎有志之士参与共建。关注 SOFAServerless,共同解决微服务领域里的问题,让 Serverless 在未来能成为一种普适的技术。

欢迎 9 月 3 号 来 QCon 大会现场一起探讨微服务架构新模式

 了解更多...

SOFAServerless Star 一下✨:

https://github.com/sofastack/sofa-serverless

推荐阅读

efd9a81ea0f4b28faeff02b187a4b28b.jpeg

超越边界:FaaS 的应用实践和未来展望

ee300901cb5eaeda0117cab545e53835.png

如何看待 Dapr、Layotto 这种多运行时架构?

925d8d868c6139d585f376f0f9121f73.png

SOFABoot 4.0 正式发布,多项新特性等你来体验!

100848e898f30cc799ef392ef79f404d.png

MoE 系列(七)| Envoy Go 扩展之沙箱安全

fd440d26cd2767fa3733737e1d51f090.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/55282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两款开箱即用的Live2d

目录 背景第一款:开箱即用的Live2d在vue项目中使用html页面使用在线预览依赖文件地址配置相关参数成员属性源码 模型下载 第二款:换装模型超多的Live2d在线预览代码示例源码 模型下载 背景 从第一次使用服务器建站已经三年多了,记得那是在2…

【沐风老师】如何在3dMax中将3D物体转化为样条线构成的对象?

在3dMax中如何把三维物体转化为由样条线构成的对象?通常这样的场景会出现在科研绘图或一些艺术创作当中,下面给大家详细讲解一种3dmax三维物体转样条线的方法。 第一部分:用粒子填充3D对象: 1.创建一个三维对象(本例…

动物体外受精手术VR模拟仿真培训系统保证学生及标本的安全

奶牛是养殖业主要的资源,因此保证奶牛的健康对养殖业的成功和可持续发展具有重要已用,奶牛有一些常见易发病,一旦处理不当,对奶牛业都会造成较大的经济损失,传统的奶牛手术培训实操难度大、风险高且花费大,…

软件设计师学习笔记6-存储系统

目录 1.层次化存储体系 1.1层次化存储结构 1.2层次化存储结构的分类 2.Cache 2.1概念 2.2映像 2.2.1概念 2.2.2分类 2.2.3不同映像的图解(帮助理解,不考) 3.主存编址方法 3.1计算公式 3.2补充内容 1.层次化存储体系 1.1层次化存储结构 局部性原理是层次…

C++day3(类、this指针、类中的特殊成员函数)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.类的应用实例 #include <iostream> using namespace std;class Person { private:string name; public:int age;int high;void set_name(string n); //在类内声明函数void show(){cout << "na…

Spring Boot多环境指定yml或者properties

Spring Boot多环境指定yml或者properties 文章目录 Spring Boot多环境指定yml或者properties加载顺序配置指定某个yml 加载顺序 ● application-local.properties ● application.properties ● application-local.yml ● application.yml application.propertes server.port…

RT1050的ADC

文章目录 1 ADC介绍2 ADC框图2.1 外部输入通道2.2 输入电压范围2.3 触发源2.4 时钟源2.5 偏移矫正功能2.5.1 校准 3 单通道中断采集实验3.1 ADC选项3.2 ADC配置3.3 配置用户通道和中断3.4 中断代码 1 ADC介绍 RT1052 有 2 个 ADC&#xff0c;每个 ADC 有 12 位、10 位、8 位可…

使用windeployqt和InstallShield打包发布Qt软件的流程

前言 Qt编译之后需要打包发布&#xff0c;并且发布给用户后需要增加一个安装软件&#xff0c;通过安装软件可以实现Qt软件的安装&#xff1b;用于安装软件的软件有很多&#xff0c;这里主要介绍InstallShield使用的流程&#xff1b; 使用windeployqt打包Qt编译后的程序 Qt程序…

【JavaEE】Spring事务-事务的基本介绍-事务的实现-@Transactional基本介绍和使用

【JavaEE】Spring事务&#xff08;1&#xff09; 文章目录 【JavaEE】Spring事务&#xff08;2&#xff09;1. 为什么要使用事务2. Spring中事务的实现2.1 事务针对哪些操作2.2 MySQL 事务使用2.3 Spring 编程式事务&#xff08;手动挡&#xff09;2.4 Spring 声明式事务&#…

【线程池】ThreadPoolExecutor的使用示例

文章目录 通过ThreadPoolExecutor创建线程池。线程的处理结果如何获取&#xff1f; 通过ThreadPoolExecutor创建线程池。 ThreadPoolExecutor构造方法参数&#xff1a; int corePoolSize //核心线程数量int maximumPoolSize//最大线程数long keepAliveTime//当线程数大于核心…

【无线点对点网络时延分析和可视化】模拟无线点对点网络中的延迟以及物理层和数据链路层之间的相互作用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Win解答 | 解决键盘中 字母+空格 导致的输入法弹窗导致的一系列问题

近三个月来&#xff0c;一直都有一个键盘组合键的问题影响我的电脑使用&#xff0c;不管是打字还是打游戏&#xff0c;都会出现按键盘的 字母空格 弹出一个特殊符号的候选框&#xff0c;如下图所示 图片中为 S空格 所出现的弹窗 一个看似方便&#xff0c;实则难受的功能 其实打…

SpringBoot入门篇2 - 配置文件格式、多环境开发、配置文件分类

目录 1.配置文件格式&#xff08;3种&#xff09; 例&#xff1a;修改服务器端口。&#xff08;3种&#xff09; src/main/resources/application.properties server.port80 src/main/resources/application.yml&#xff08;主要用这种&#xff09; server:port: 80 src/m…

[Go版]算法通关村第十四关白银——堆高效解决的经典问题(在数组找第K大的元素、堆排序、合并K个排序链表)

目录 题目&#xff1a;在数组中找第K大的元素解法1&#xff1a;维护长度为k的最小堆&#xff0c;遍历n-k个元素&#xff0c;逐一和堆顶值对比后&#xff0c;和堆顶交换&#xff0c;最后返回堆顶复杂度&#xff1a;时间复杂度 O ( k ( n − k ) l o g k ) O(k(n-k)logk) O(k(n−…

CSS实现内凹圆角,从而实现圆角边框

1、代码 <!DOCTYPE html> <html><head><style>.uu {position: relative;width: 400px;height: 300px;}img {width: 100%;height: 100%;z-index: 1;}.box_right_top {background-image: radial-gradient(circle at left bottom, transparent 50px, whi…

统信OS国产操作系统身份证读卡器社保卡读卡web网页开发使用操作流程

用于DONSEE系列身份证阅读器谷歌Chrome火狐Firefox插件&#xff0c;支持的型号有&#xff1a;EST-100、EST-100GS、EST-100G、EST-100U、EST-200G、EST-J13X等。 本方案无缝支持最新版本谷歌Chrome火狐Firefox等网页浏览器&#xff0c;支持H5、Vue、React、Node.js、Electron、…

设计模式--单例模式(Singleton Pattern)

一、什么是单例模式 单例模式是一种创建型设计模式&#xff0c;它旨在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。换句话说&#xff0c;单例模式限制了类的实例化次数为一个&#xff0c;并提供一种在应用程序中共享一个实例的方式。这对于需要只有…

Linux系统编程:线程控制

目录 一. 线程的创建 1.1 pthread_create函数 1.2 线程id的本质 二. 多线程中的异常和程序替换 2.1 多线程程序异常 2.2 多线程中的程序替换 三. 线程等待 四. 线程的终止和分离 4.1 线程函数return 4.2 线程取消 pthread_cancel 4.3 线程退出 pthread_exit 4.4 线程…

Day44|leetcode 518.零钱兑换II、377. 组合总和 Ⅳ

完全背包理论基础 视频链接&#xff1a;带你学透完全背包问题&#xff01; 和 01背包有什么差别&#xff1f;遍历顺序上有什么讲究&#xff1f;_哔哩哔哩_bilibili 完全背包与01背包不同的地方就是&#xff1a;01背包每种物品只能取一次&#xff0c;而完全背包每种物品可以取…

2023年国赛数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…