看!闲鱼在ServiceMesh的探索和实践

背景:

在阿里服务端开发以Java为主的大背景下,其他异构语言业务如何调用现有Java服务,如何与集团中间件打通,就成为使用非Java语言团队必须要解决的首要问题。

已有方案问题:

在ServiceMesh方案成熟之前,我们采用:通过Dart C/C++扩展方式调用各中间件客户端SO库(类JNI)。该方案在业务初期很好的解决了Dart服务端生态建设问题。但是该方案还存在以下几个问题:

  1. 运维耦合度高。业务代码和客户端SO库代码打包在一起,运行在同一进程,一旦微服务框架需要升级,业务代码也需要维护和重启。
  2. 复杂性:进程内的多个语言环境,跨语言数据表示和传输等问题,都会增加系统的复杂性,降低原有服务的性能。
  3. 接入成本高
  4. 新功能滞后

ServiceMesh方案:

由于现有方案存在的一些问题,我们转向ServiceMesh寻找解决问题的思路

如上图所示:与目前比较常见的微服务框架相比,ServiceMesh把微服务客户端核心功能独立出来,并作为一个独立Proxy进程部署在每一个主机上,业务进程通过Proxy进程与外界通信。这个独立的Proxy进程就是ServiceMesh的核心: SideCar。

业务进程和SideCar之间最常见的两种通信方案:1. 基于Iptables的流量拦截转发方案,2. 业务进程通过轻量化Mesh客户端直连SideCar。从实现原理上看,Iptables方案相比直连方案会有一定的性能损耗和延迟。我们选择的ALiMesh方案采用了轻量级Mesh客户端方案。

Mesh化之后,业务进程只包含业务代码和轻量化的Mesh Client,代码逻辑变得简单,问题定位更清晰。业务同学可以更专注业务开发,而不用关注微服务庞杂的逻辑。微服务框架核心功能的开发维护扩展升级等工作由专门的Mesh团队负责,独立升级维护,与业务解耦,业务无感知。

ServiceMesh方案解决了现有方案存在的:运维成本、接入成本问题,代码复杂问题。 而且采用开源的Mesh方案,还可以借助开源的力量,不断增加新的功能。

ALiMesh接入:

SideCar的引入,使得原本业务跟微服务之间的进程内通信转变成进程间的通信,进出流量增加了一跳,那么ServiceMesh的引入对业务性能带来的影响具体怎么样?接下来我们基于ALiMesh(Istio开源方案阿里版本)一起分情况看下。

ALiMesh提供了2种接入方案:Http方式、HSF方式。其中Http方式又分为Http1.0和Http2.0方式。

AliMesh Http方案(快速接入方案):

如图所示,Http方式下:在数据面,业务进程与SideCar,SideCar与Service Provider之间采用Http协议交互,数据编码采用Json。业务进程集成了基于Http协议的Mesh Client,Mesh SideCar通过泛化调用远程调用Java HSF服务。

而在控制面: ISTIO控制面同步ConfigServer的服务提供者列表数据,SideCar跟ISTIO pilot走原生的服务同步通道。

由于Http协议的通用性,该方案接入简单,快速的验证了Mesh方案的可行性,但是性能还达不到业务的线上要求,经测试,主要指标如下:

备注:目前闲鱼只使用了ServiceMesh OutBound功能。为了模拟线上详情页真实流量情况,每次上游请求处理过程会调用21次下游Java HSF服务, 所以图中QPS换算成Mesh流量时,需要乘以21倍,以下测试都是如此

如图所示:Mesh方式相比直连方式,Consumer侧CPU消耗增长一倍,每一次RPC调用RT增加了近2ms。且HSF Provider侧CPU也有近40%的增加,这一点跟HSF同学的测试结果基本吻合。经过分析,我们初步定位引起CPU消耗增加的主要原因是Http1.1协议的连接方式(已经使用了连接池)和数据编码。

为了验证该方案的问题所在,我们测试接入了Http2.0方案。Http2.0相比Http1.x,在连接多路复用、数据格式、head压缩等等方面具有天然的优势。经过测试,ALiMesh的性能也较Http1.x有了较大的提升。部分满足或者接近我们的技术要求。详细指标如下图所示:

如图所示,优化后,业务进程Consumer侧,CPU和RT消耗稍稍有些超标(CPU 增加不超过20%)。为了探索更高性能,更低延迟的方案,我们转向了HSF私有协议方案。

AliMesh HSF扩展协议方案(高性能方案):

如图所示,HSF方案下,HSF RPC协议实现为Mesh SideCar的一个扩展协议。在数据面:业务进程与SideCar,SideCar与Service Provider 之间采用HSF 2.0私有协议,数据编码采用Hessian 1.0。业务进程集成了Mesh化改造的HSFCPP SO库作为MeshClient,负责与Mesh SideCar通信。而在控制面:SideCar与Configsvr直连,同步服务提供者列表和配置信息,采用差量同步方式,以降低控制面板的CPU消耗。详细测试数据如下:

经过不断优化,最终成功将Mesh CPU增长控制在20%以内,每跳RPC调用RT增加控制在1ms以内。

ServiceMesh在闲鱼的应用:

目前Dart+ALiMesh方案在闲鱼服务端已经稳定运行八个月+,服务于闲鱼详情页、猜你喜欢,租房首页等业务, 期间Mesh多次进行优化、升级、扩展功能等运维工作,业务进程都无感,正常对外提供服务,业务同学不需要参与。

ALiMesh引入后,对线上业务RT的影响如下图所示:橙色的曲线是Mesh化后的业务RT监控曲线,蓝色的曲线是Mesh化前一周业务RT监控曲线,排除线上环境日常的波动后,ALiMesh的引入对线上业务RT的影响相当小。

总结与展望:

ServiceMesh方案,将微服务逻辑和服务间通信这些与业务无关的逻辑从业务应用中解耦出来,让业务应用瘦身,让业务同学更专注于业务开发。同时也让异构语言能够低成本的建立服务端生态,接入现有系统。

当然对于性能损失,个人认为总体利大于弊。业务团队可以根据自己业务实际情况进行测试评估,权衡利弊是否要接入ServiceMesh。

接下来我们会进一步扩大AliMesh在闲鱼的应用,并与ALiMesh合作,推动AliMesh在Dart Faas落地,适配更多的中间件。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

编译错误 错误:PL/SQL: ORA-00932: 数据类型不一致: 应为 DATE, 但却获得 NUMBER 行

文章目录1. 现象2. 分析3. 解决方案通过存储过程将临时B表中的数据同步到轨迹表中 1. 现象 PROCEDURE LABS.ASSET_LOANP 编译错误错误:PL/SQL: ORA-00932: 数据类型不一致: 应为 DATE, 但却获得 NUMBER 行:17 文本:(select n.*, trunc(DBMS_R…

如何保证 HBase 服务的高可用?看看这份 HBase 可用性分析与高可用实践吧!

来源 | 阿丸笔记责编 | Carol头图 | CSDN 下载自视觉中国HBase作为一个分布式存储的数据库,它是如何保证可用性的呢?对于分布式系统的CAP问题,它是如何权衡的呢?最重要的是,我们在生产实践中,又应该如何保证…

python3-matplotlib绘制散点图、绘制条形图

matplotlib 支持的图形 https://matplotlib.org/stable/gallery/index.html 1、绘制散点图 from matplotlib import pyplot as plt from matplotlib import font_manager# y_3是三月每天的最高温度 y_10 是十月每天的最高温度 y_3 [11,17,16,11,12,11,12,6,6,7,8,9,12,…

ORA-01858: 在要求输入数字处找到非数字字符 13行

文章目录1. 现象2. 分析3. 解决方案ORA-01858: 在要求输入数字处找到非数字字符13行 1. 现象 insert /*append*/ into ASSET_LOAN(select * from ASSET_LOANB );commit;2. 分析 由于ASSET_LOANB表和ASSET_LOAN表字段顺序不一致导致的 具体分析:由于ASSET_LOANB表倒数…

牛!Python 全栈必备的 150 个实战案例,一次性获得!

Python 全栈将是你升职加薪的硬通货。我见过很多的 Python 讲解教程和书籍,它们大都这样讲 Python 的:先从 Python 的发展历史开始,介绍 Python 的基本语法规则,Python 的 list, dict, tuple 等数据结构,然后再介绍字符…

数据权限实现

权限框架可以根据用户所属角色决定有权限看到的菜单资源权限。 同一个资源下的同一个菜单的数据权限需要单独处理。 案例:一部门的张三和二部门的李四都是普通用户角色,普通用户都有用户管理的查询权限,但是,一部门的张三只能看到…

遍地开花的 Attention ,你真的懂吗?

阿里妹导读:曾被 paper 中各种各样的 Attentioin 搞得晕晕乎乎,尽管零零散散地整理过一些关于Attention 的笔记,重点和线索依然比较凌乱。今天,阿里巴巴工程师楠易,将 Attentioin 的知识系统性地梳理、回顾、总结&…

Wrapper+map实现页面显示

文章目录1. 查询用户数据map集合2. map集合参数拼装1. 查询用户数据map集合 2. map集合参数拼装 用户角色和部门名称,根据角色ID和部门id分别查询替换,简言之:需要的内容分别通过单独查询数据库得到,然后通过遍历依次对比&#xf…

手淘促活那些事儿 | 智能投放算法框架助力用户增长

导读:本文主要介绍以手淘促活为目的的全链路智能投放算法框架,该框架目前接入以 Pagani 为核心的全链路运营平台,首先使用用户意图识别算法圈选出目标人群,然后借助物料智能推荐和权益动态面额等算法实现全链路上用户的个性化触达…

天天用Redis,持久化方案你又知道哪些?

来源 |码猿技术专栏责编 | Carol头图 | CSDN 下载自视觉中国Redis目前已经成为主流的内存数据库了,但是大部分人仅仅是停留在会用的阶段,你真的了解Redis内部的工作原理吗?今天这篇文章将为大家介绍Redis持久化的两种方案,文章将会…

万万没想到,JVM内存结构的面试题可以问的这么难?

在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了。 那么,请大家尝试着回答一下以下问题: 1、JVM管理的内存结构是怎样的? 2、不同的虚拟机在实现运行时内存的…

Serverless 落地挑战与蚂蚁金服实践

目前 Serverless 已成为云原生社区关注的重点之一,有人说它是微服务的继承者,将会彻底改变软件研发的现状,那么真实情况如何呢?本文将介绍 Serverless 市场观察、落地挑战,以及蚂蚁金服对 Serverless 的实践。 Server…

程序员感叹一年只能存下15万太少了……网友:潸然泪下

最近有程序员网友晒出自己的年终奖,税后高达15.7万!看到这个情形,很多网友表示自己“被打鸡血了”。他强调学习的重要性,学习仍然是在这个时代下,普通人能够逆袭,给家人更好生活的一把利器!今天…

机器学习工程师第一年的12点体会

机器学习和数据科学都是广义上的术语,它们涉及超级多的领域以及知识,一位数据科学家所做的事情可能与另一位有很大的不同,机器学习工程师也是如此。通常使用过去(数据)来理解或预测(构建模型)未…

今天下午三点,2020深圳开放数据应用创新大赛将举行第二场线上推介会

4月27日15:00 - 16:30,网易客户端、ZAKER、华为云、南方 plus、虎牙在线直播每场线上推介会设两轮抽奖,欢迎互动。继4月20日首场线上推介会顺利举行后,4月27日下午,以"数聚粤港澳,智汇大湾区"为主题的"…

解决Another app is currently holding the yum lock; waiting for it to exit...问题

在下载安装lrzsz时出现Another app is currently holding the yum lock; waiting for it to exit...问题yum被锁定了可以使用 rm -rf /var/run/yum.pid 强制杀死进程来解决

优化 Tengine HTTPS 握手时间

背景 网络延迟是网络上的主要性能瓶颈之一。在最坏的情况下,客户端打开一个链接需要DNS查询(1个 RTT),TCP握手(1个 RTT),TLS 握手(2个RTT),以及最后的 HTTP …

揭秘!如何用Flutter设计一个100%准确的埋点框架?

阿里妹导读:用户行为埋点是用来记录用户在操作时的一系列行为,也是业务做判断的核心数据依据,如果缺失或者不准确将会给业务带来不可恢复的损失。闲鱼将业务代码从Native迁移到Flutter上过程中,发现原先Native体系上的埋点方案无法…

安装rzsz

yum install -y lrzsz

抽象思想解读Linux进程描述符

来源 | 嵌入式客栈责编 | Carol头图 | CSDN 下载自视觉中国内核是怎么工作的?首先要理解进程管理,进程调度,本文开始阅读进程管理部分,首先从进程的抽象描述开始。抽象是软件工程的灵魂,而对于Linux操作系统而言&#…