Proxyless Service Mesh在百度的实践与思考

发表于 2年以前  | 总阅读数:359 次

Service Mesh 已经在云原生界火了很多年,大家的探索热情依然不减。而最近一段时间 Proxyless Service Mesh 也开始进入大家的视野,比如:“Istio 官宣支持 gRPC Proxyless Service Mesh”,“Dubbo 3.0 引入 Proxyless Service Mesh 架构”。

那么,什么是 Proxyless Service Mesh?它和原来的 Proxy Service Mesh 有什么区别和优缺点?落地场景又有哪些呢?本文将结合 Proxyless Service Mesh 在百度的落地实践,带你一探究竟。

什么是 Proxyless Service Mesh

来看下 Proxy Service Mesh,也就是最常见的 Service Mesh 架构,一般如下所示:

  • 每个 App 的 Pod 里面,有一个独立的 Sidecar 进程,App 之间的通信都通过 Sidecar 进程转发。
  • 有一个全局的控制平面(最常见的实现是Istio),下发配置到每个 Sidecar,控制具体请求的转发策略。

而 Proxyless Service Mesh 则是如下的架构:

  • 由联编到 App 进程的 rpc 框架负责服务之间的通信。
  • 控制平面下发配置到每个 rpc 框架,rpc 框架按照配置进行具体请求的转发(以上架构图是经过简化的,以目前主流的 Proxyless 实现,比如 gRPC 和 Istio 之间的通信是由 Istio Agent 来代理的,但这不影响后面的讨论)。

Proxyless Service Mesh 的优缺点

如果简单对比上述架构,不难得出 Proxyless 和 Proxy 模式的优缺点:

以上仅是一些直观的分析,但当真正落地 Proxyless Service Mesh 的时候,会发现情况并不是我们想的那么简单。

百度的 Proxyless Service Mesh 实践

Proxyless 第一阶段百度从 2018 年开始引入 Service Mesh,一开始是 Proxy 模式。到了 2020 年,我们在落地一些业务线的时候,发现 Proxy 模式很难在整个业务线全面铺开:

  • 业务其实能够接受 Proxy 带来的额外资源开销,毕竟我们已经做了很多优化,比如将社区 Both Side 模式改成 Client Side 模式(即一次请求只过 Client 端的代理,不经过 Server 端的代理);比如将 Envoy 的流量转发内核替换成 bRPC。我们能做到 Sidecar 占业务进程的 cpu 消耗在 5% 以内,有的业务甚至不到 1%。
  • 但业务无法接受 Proxy 带来的延迟增长,即使我们已经把 Proxy 单次转发增加的延迟优化到 0.2 毫秒以内,但由于整个业务系统包含了很大的一个调用拓扑,每条边上增加一点点的延迟就能导致流量入口模块增加较大的延迟,进而对业务 KPI 造成影响。

因此我们开始引入如下的 Proxyless Service Mesh 模式:

  • Envoy 从 Istio 拿到流量转发配置,并转化成 bRPC 能识别的配置
  • bRPC 通过 http 接口从 Envoy 中拿到流量转发配置,并且按照该配置去调用其它服务

这种方式的好处是:

  • 业务接入 Mesh,不会带来延迟增长,也不会增加明显的资源开销(这里的 Envoy 仅处理配置,资源开销极小)。
  • 业务可以享受 Mesh 的便利性,如集中管理配置、动态下发配置生效,不再需要改代码或改配置、上线、重启生效,极大提升了服务治理的效率。

Proxyless 第二阶段

但是,第一阶段方案,存在一些明显的问题:

  • bRPC 里支持的服务治理策略较少,仅支持 Istio 中的少量功能,这就意味着大部分 Istio 的能力无法通过 Proxyless 模式享受到。
  • 随着业务不断增加的需求,我们势必要在 Service Mesh 中增加更多的服务治理能力。对于 Proxy 模式,我们需要在 Envoy 中开发,而对于 Proxyless 模式,我们又需要在 bRPC 中开发,由于 Envoy 和 bRPC 的策略架构差异很大,这些代码很难复用,就意味着每一个需求都得重复开发两遍。

因此,到了 2021 年,我们设计并实现了一套 Proxyless/Proxy 统一架构的 Service Mesh:

  • 左边是 Proxyless 模式,Envoy 负责把 xds 配置转换成 bRPC 能识别的配置,bRPC 联编到业务进程,从 Envoy 获取配置并按配置转发请求。
  • 右边是 Proxy 模式,Envoy 仍负责把 xds 配置转换成 bRPC 能识别的配置,bRPC 联编到 Envoy 进程,从 Envoy 获取配置并按配置转发请求。

无论是哪种模式,Envoy 都负责转换配置,bRPC 负责配置执行,因此,所有的代码都可以在 Proxy 和 Proxyless 模式下复用。

从业务场景上:

  • C++ 服务,可以联编 bRPC,使用 Proxyless 模式;
  • 延迟不敏感的非 C++ 服务(如 Go/Python/PHP/Java 等),可以无侵入使用 Proxy 模式;
  • 延迟敏感的非 C++ 服务:什么,既然延迟敏感了,为啥不用 C++ 开发?(这里的延迟敏感指的是一毫秒必争的这种敏感程度)

服务治理能力提升:

  • 在这个架构的基础上,我们丰富了 bRPC 的服务治理能力,基本覆盖了我们用到的所有 Istio 的能力,如权重路由、基于请求内容的路由、实例子集路由、流量复制、错误注入、异常实例驱逐、自定义错误码重试等。
  • 由于采用了 bRPC 架构,我们可以将先前公司内基于 bRPC 架构实现的优秀服务治理策略都集成到 Service Mesh,包括延迟感知的负载均衡、基于错误码的动态实例调权、基于请求优先级的分级调度、基于分位值的动态超时和 Backup request、重试比例熔断,这些能力是原生 Envoy 所缺失的,但是对于降低延迟、提升服务稳定性至关重要。
  • 得益于 bRPC 多协议架构,上述所有的 Istio 服务治理能力、公司内部优秀服务治理策略,都可以支持 bRPC 中的所有协议。相比之下,在 Envoy 中只有 HTTP 协议是一等公民,其它协议的治理能力都相当薄弱。另外由于 bRPC 支持协议自动嗅探,我们无须扩展 Istio 下发协议类型,所有协议都按 HTTP 方式配置即可。

Proxyless 第三阶段

  • bRPC 直接支持和 istio 通信,获取 xds 配置并进行转换;
  • Proxyless 模式,bRPC 联编到业务进程中进行请求转发;
  • Proxy 模式,bRPC 作为一个独立的 sidecar 进程进行请求转发。

这个架构彻底解决了 Envoy 这个历史包袱,让 Service Mesh 轻装上阵。

让我们回过头看一下前面说的 Proxyless 模式的两个缺点是怎么被解决的:

  • 开发效率:我们仍然只需要开发一套策略,适用于所有语言(C++ 用 Proxyless,其它语言用 Proxy),不需要为每个语言开发 SDK。
  • 升级效率:由于百度内部 C++ 有 depend on stable 机制(类似于 Google 的 depend on HEAD),基础库有一个 stable 发布分支,而其它模块都依赖于基础库的 stable 分支。这样,当我们升级了 bRPC 中的 Service Mesh 功能时,只要将代码合并到 stable 分支,所有的上游模块都会自动更新,不需要再一个一个推动业务升级。至于非 C++ 语言,使用 Proxy 方式来保证升级效率。

似乎这两个缺点在我们的场景里都没有了:)

Proxyless 模式的真正优势

Proxyless 模式的真正优势是性能吗?一开始我们都是这么认为的,但是随着我们落地 Proxyless 模式的过程,我们才逐渐发现 Proxyless 模式的更多优势。让我们来看看一些场景吧:

请求级别控制参数的场景

比如我们要在 Service Mesh 中实现一致性哈希负载均衡,原来没有 Service Mesh 的时候,用户通过 RPC 框架提供的一个 set_request_code() 方法来设置请求级别哈希码,RPC 框架可以确保同一个 request_code 的请求被调度到同一个后端实例。

在 Service Mesh 中如何实现这个需求呢?如果是 Proxy 模式,负载均衡是在 Sidecar 做的,Sidecar 需要获取到这个 request_code。总不能让用户改代码吧?那么只能修改 RPC 框架,让框架把 request_code 传给 Sidecar。如图所示:

怎么传给 Sidecar 呢?得在协议里的某个字段中传过去,比如 HTTP 协议可以在 header 中传过去,那么其它协议呢?每个协议都得找一个地方来传这个字段,每个协议都得实现一遍这个逻辑。

所以在 Proxy 模式下,传参这个事的实现成本 =(RPC 框架发送参数 +Sidecar 接收参数)* 协议数量。

那么在 Proxyless 模式下呢?这个参数本来 RPC 框架就能拿到,所以传参的实现成本 =0。

除了一致性哈希,类似的场景还有很多,比如请求级别超时控制、请求级别路由参数等,在这些场景下,Proxyless 模式完胜。

框架回调业务代码的场景

比如用户想实现一个自定义重试策略,RPC 框架在访问一次后端服务之后,调用用户代码来判断是否需要重试。一个典型的流程如下所求:

现在业务想要接入 Service Mesh,如果用 Proxy 模式,该如何实现用户自定义重试策略呢?考虑以下方案:

  • 方案一:将业务代码中的自定义重试策略实现到 Sidecar 代码里。问题是,业务的自定义重试策略可能不具有通用性,放在 Sidecar 这种通用基础设施的代码里显然不合适。
  • 方案二:Sidecar 提供一种扩展机制,比如 WASM,用户将自定义重试策略实现为 WASM,以配置方式下发给 Sidecar 去执行。问题是,将原有代码改造成 WASM 的成本可能较高,这会明显降低业务接入 Mesh 的意愿。而且 WASM 的性能也不高。
  • 方案三:业务进程暴露一个服务接口,Sidecar 调用这个接口来决定是否要重试。问题是,这样增加了业务进程和 Sidecar 之间的交互次数,增加了延迟,也增加了问题出现的概率。

在 Proxy 模式下,无论采用哪种方案,问题都很大。在 Proxyless 模式下呢?由于该功能 RPC 框架本来就支持,成本 =0。除了自定义重试策略,类似的场景还很多,比如自定义负载均衡策略、自定义 NamingService 等,在这些场景下,Proxyless 模式完胜。

动态多分片的场景

先解释一下什么叫动态多分片。多分片在搜索、推荐类业务是一个典型场景,也就是说一个服务的一个实例并不加载全量的数据,只加载一个分片的数据。客户端调用此类服务时,需要将请求同时发送给不同分片的后端服务实例,获取到每个分片的结果再进行汇总处理。动态多分片是指多个分片的服务组成一个分组,每次请求可以动态地选择一组分片。之所以需要多个分组,一种场景是因为数据发生扩容时,分片数会发生变化,为了保证流量平滑迁移,会同时存在不同分片数量的分组;另一种场景是由于业务需要,不同的分组加载了不同业务属性的数据,需要根据请求来动态确定调用哪个分组的服务。如下图所示,分组 A 有 2 个分片,分组 B 有 3 个分片,而 k1、k2 则代表了不同的业务属性。

在动态多分片场景下,业务代码和 RPC 框架的一个简化的交互流程如下:

之所以需要分两个阶段调用 RPC 框架,是因为业务需要根据最终选定的分组和分片数量来拼装业务的请求。

现在业务想要接入 Service Mesh,让我们看看在 Proxy 模式下支持动态多分片的方案:

  • 方案一:...(此处省略 300 字),不行,这个方案性能太差;
  • 方案二:...(此处省略 500 字),不行,这个方案成本太高;
  • 方案三:抱歉,我想不出其它方案了……

现在,让我们看看 Proxyless 模式下支持动态多分片的方案:

  • 沿用原来的二阶段流程,在第一阶段,执行 Service Mesh 中的各种路由策略,确定最终的分组,以及决策是否做流量复制、流量复制目的分组。
  • 第二阶段,先按原来 RPC 框架逻辑进行多分片并行调用,具体到单个分片上,使用 Service Mesh 中的负载均衡、超时重试等策略。如需流量复制,则异步执行流量复制到另一个分组。

虽然这个方案也有一定复杂性,但实现成本也不是很高,比 Proxy 模式的实现成本低多了。所以,在动态多分片场景,Proxyless 模式完胜。

服务可观测场景

服务可观测是 Service Mesh 的重点场景,我们来看一下这个场景下的一些需求吧:

  1. 用户想实现分布式 trace,需要将服务的入口流量和出口流量建立关联,比如在处理 trace_id=x, span_id=y 的入口流量过程中,发出的出口流量,其 trace_id=x, parent_span_id=y。Sidecar: 这事我干不了,得靠 RPC 框架。
  2. 用户想把业务日志和 RPC 日志进行串联,比如在处理 trace_id=x 的请求过程中,打印的业务日志中都包含 trace_id=x 字段,这样可以进行汇聚计算。Sidecar:这事我干不了,得靠 RPC 框架和日志库打通。
  3. 用户想监控请求处理过程的一些细化耗时,比如排队时间、序列化反序列化时间。Sidecar:这事我干不了,得靠 RPC 框架。
  4. 用户想实现流量染色,比如将入口请求打上 k=v 标签,然后由该请求触发的整个调用链的请求都会带上 k=v 标签。Sidecar:这事我干不了,得靠 RPC 框架。
  5. 用户想针对业务代码的耗时、cpu 使用进行分析,找出瓶颈。Sidecar:这事我干不了……

为什么会出现这些情况呢?实现服务可观测的最好方法就是深入服务内部,对于 Sidecar 来说,服务就是个黑盒,当然不好实现了。

所以,对于服务可观测场景,Proxyless 模式完胜。

重新思考 Service Mesh 的本质

Service Mesh 的本质是 Sidecar 吗?

诚然,Sidecar 是 Service Mesh 的一大卖点,比如方便支持多语言、和应用解耦,这可以让用户更方便地接入 Service Mesh。但是我们更应该关注 Service Mesh 给用户带来了什么价值,如果用户用了 Service Mesh 没有收益,即使接入成本为 0,用户也会不接入的。

从用户角度看,Service Mesh 带来的是以下价值:

  • 服务可用性提升:比如各种超时重试、限流熔断策略带来的提升;
  • 延迟降低:比如延迟感知的负载均衡策略可以实现服务整体延迟的降低;
  • 服务可观测:比如链路黄金指标、调用链追踪能力可以提升服务可观测性;
  • 流量调度灵活性:比如各种路由策略可以实现灰度发布、跨机房切流等;
  • 安全性:比如 TLS、各种认证鉴权机制可以提升服务间调用的安全性;
  • 管理便利性:上述策略都可以通过控制平面集中管理,动态下发生效。

因此我认为,Service Mesh 就是能让服务间通信更可靠、更快、更透明、更灵活、更安全、更便于管理的基础设施。

至于这个基础设施是 Proxyless 还是 Proxy 模式,其实不是很重要。从实际业务场景出发,哪种模式更容易满足业务需求,就用哪种方案。两种模式各有自己的优势场景,结合起来可以提供更好的服务。

Service Mesh 的本质是配置中心吗?

有一种观点认为,Proxyless 模式不就是 RPC 框架 + 配置中心吗?Proxy 模式不就是一个 7 层代理 + 配置中心吗?这玩意很多年前就有了。

但是,Service Mesh 的控制平面,不能简单看作配置中心。配置中心仅仅是简单地将配置文件或者配置项进行下发,并不感知配置的实际含义。

以 Istio 为代表的控制平面,实际上是定义了 Service Mesh 的能力标准,比如各种路由、负载均衡策略等。如果只是做了一个简单的 RPC 框架,暴露了几个超时参数到配置中心来控制,那不叫 Service Mesh,因为没有实现 Service Mesh 的标准能力。即使 RPC 框架把 Service Mesh 的标准能力都实现了,但是没有统一的协议和配置格式,不同的框架的配置方式五花八门,通信协议互相割裂,那也不能算 Service Mesh。

所以说,Service Mesh 是一组服务间通信的能力标准,实现了这些标准,就可以称之为 Service Mesh。

Service Mesh 未来展望

从目前趋势看来,Istio 仍然会作为 Service Mesh 控制平面的首选。尽管 Istio 的 CRD 对用户也不是很友好,但是 Istio 定义的 Service Mesh 标准体系目前仍是最完整的,也获得了最广泛的数据平面的支持。

而数据平面,则可能出现百花齐放的场景,毕竟业务场景非常多样,有的看重灵活性,有的看重性能,有的看重安全,那么就能催生不同的数据平面实现方案。Envoy 仍然会作为 Proxy 模式的主流选择,但各 RPC 框架也不甘于只做瘦客户端,将会继续发展自己的 Proxyless 方案,让 Service Mesh 能落地到更多的业务场景之中。

本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/8T7XI6jQfZunwVYDaDHvLw

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237229次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8063次阅读
 目录