文|周群力(花名:仪式 )
Layotto PMC
Layotto 和 SOFAStack 开源社区的建设,Dapr 贡献者,Dapr sig-api 的 Co-chair
本文 10963 字 阅读 20 分钟
2019 年,微软开源了 Dapr 项目。2021 年,蚂蚁参照 Dapr 思想开源了 Layotto 项目。如今,蚂蚁已落地 Layotto,服务了很多应用。从理想落地到现实的过程中,我们遇到了不少问题,也对项目做了很多改变。回过头再看,如何看待 Dapr、Layotto 这种多运行时架构?我们能从中学到什么?
本次我将从以下几个方面,分享蚂蚁在落地多运行时架构之后的思考:
1. 如何看待“可移植性”
2. 多运行时架构能带来哪些价值
3. 与 Service Mesh、Event Mesh 的区别
4. 如何看待不同的部署形态
PART. 1 快速回顾
如果你熟悉 Multi-Runtime、Dapr 和 Layotto 的概念,可以跳过这一章节,直接进入下一章节。
快速回顾:什么是 Multi-Runtime 架构?
Multi-Runtime 是一种服务端架构思路,如果用一句话来概括,就是把应用里的所有中间件挪到 Sidecar 里,使得“业务运行时”和“技术运行时”分离开。
更详细的解释如下:首先来看 Service Mesh,和传统 RPC 框架相比,Service Mesh 的创新之处在于引入了 Sidecar 模式。Service Mesh 只解决了服务间通讯的需求,而现实中的分布式应用存在更多需求,比如“协议转换”、“状态管理”等。Multi-Runtime 架构提出将各种各样的分布式能力外移到独立 Runtime,最后和应用 Runtime 共同组成微服务,形成所谓的“Multi-Runtime” (多运行时) 架构。
具体细节可以详阅《Multi-Runtime Microservices Architecture》和《Mecha:将 Mesh 进行到底》。
哪些项目实现了 Multi-Runtime 架构?
Dapr
Dapr 的全称是“Distributed Application Runtime”,即“分布式应用运行时”,是一个由微软发起的开源项目。
Dapr 项目是业界第一个 Multi-Runtime 实践项目,Dapr 的 Sidecar,除了可以和 Service Mesh 一样支持服务间通讯,还可以支持更多的功能,如 state (状态管理) 、pub-sub (消息通讯) ,resource binding (资源绑定,包括输入和输出) 。Dapr 将每种功能抽象出标准化的 API (如 state API) ,每个 API 都有多种实现,比如用户可以面向 state API 编程,但是可以随意切换存储组件,今年用 Redis,明年改成用 MongoDB,业务代码不用改。
如果之前没有接触过 Dapr,更详细的介绍可以阅读《Dapr v1.0 展望:从 Service Mesh 到云原生》这篇文章。
Layotto
Layotto 是由蚂蚁集团 2021 年开源的一个实现 Multi-Runtime 架构的项目,核心思想是在 Service Mesh 的数据面 (MOSN) 里支持 Dapr API 和 WebAssembly 运行时,实现一个 Sidecar 同时作为 Service Mesh 数据面、多运行时 Runtime、FaaS 运行时。项目地址为:https://github.com/mosn/layotto
以上是本文背景,接下来是本次主题分享。
PART. 2 你真的需要这种“可移植性”吗?
社区比较关注 Dapr API 的“可移植性”,但在落地过程中,我们不禁反思:你真的需要这种“可移植性”吗?
标准化 API 能满足所有需求吗?
数据库领域曾出现过一个有趣的讨论:同一个数据库能否适用于所有场景,满足所有需求? 比如,一个数据库能否同时支持 OLAP+OLTP+ACID 等等需求?
今天,我们在建设 Dapr API 的过程中也遇到了有趣的问题:在某个产品领域 (比如消息队列) ,能否定义一套“标准 API”同时适用于所有的消息队列?
当然,这两个问题不能混为一谈:即使是两种不同类型的数据库,比如两个数据库,一个只做 OLAP,另一个只做 OLTP,它们都可以支持 SQL 协议。两个差距那么大的数据库都能用同样的协议,我们有理由相信:在特定领域,设计一个适用于所有产品的“标准 API”是可行的。
可行,但现在还不完全行。
现在的 Dapr API 还比较简单,简单场景足以胜任,但在复杂的业务场景下,做不到“帮助应用 Write once,run on any cloud”。对这个问题,敖小剑老师的文章《死生之地不可不察:论 API 标准化对 Dapr 的重要性》有过详细描述,大意是说:
现在的 Dapr API 比较简单,在生产落地的时候满足不了复杂需求,于是开发者只能添加很多自定义的扩展字段,在 Sidecar 的组件里做特殊处理。比如下面是用 State API 时候的一些自定义扩展字段:

(图片摘自敖小剑老师的文章)
这些自定义的扩展字段会破坏可移植性:如果你换一个组件,新组件肯定不认识这些字段,所以你得改代码。
之所以出现这个问题,背后的根本原因是 Dapr API 的设计哲学。
社区在设计 Dapr API 时,为了可移植性,设计出的 API 倾向于 “功能交集” 。比如在设计 Configuration API 时,会考察各种配置中心 A、B、C,如果 A、B、C 都有同一个功能,那么这个功能才会出现在 Dapr API 中:

然而,在现实世界中,人们的需求可能是 A 和 B 的交集,B 和 C 的交集 (如下图红色部分) ,而不是 A、B、C 的交集:

或者更常见,用户的需求是“B 的所有功能”,其中必然包括一些 B 独有的功能,Dapr API 无法覆盖:

Dapr 提供“标准 API”、“语言 SDK”和“Runtime”,需要应用进行适配 (这意味着老应用需要进行改造) ,侵入性比较大。
因此 Dapr 更适合新应用开发 (所谓 Green Field) ,对于现有的老应用 (所谓 Brown Field) 则需要付出较高的改造代价。但在付出这些代价之后,Dapr 就可以提供跨

本文深入探讨了蚂蚁集团在落地Dapr风格的多运行时架构Layotto过程中遇到的问题、标准化API的局限性,以及Runtime架构的价值和部署形态的挑战。作者分享了如何看待可移植性、与ServiceMesh和EventMesh的区别,以及在实践中如何平衡标准化和灵活性。
最低0.47元/天 解锁文章
809

被折叠的 条评论
为什么被折叠?



