干货 | 携程酒店MOCK全链路实践

字节跳动全链路压测(Rhino)的实践 1. 背景随着公司业务的不断扩张,用户流量在不断提升,研发体系的规模和复杂性也随之增加。线上服务的稳定性也越来越重要,服务性能问题,以及容量问题也越发明显。因此有必要搭建一个有效压测系统... 阅读详情

作者简介

刘晓攀,携程酒店性能测试负责人,专注性能测试分析和辅助测试工具的开发。

一、前言

Mock在整个软件开发测试周期中已经非常普遍,我们也会经常有意无意地使用它。譬如开发了一段代码,这段代码强依赖了其他服务,在对方服务完成之前,肯定是期望代码能够同步开发。那么在开发的过程中一定会根据约定固定对方服务的返回,这种在代码中的模拟行为,是一种mock。

另外当前很多应用为了提高性能,普遍采用cache的方式。有些cache数据是需要很多database的数据经过一定的逻辑运算得到的,而在测试过程中,为了快速验证测试场景,直接取修改cache数据的方式,也是一种mock。

在当前五花八门的mock方式中,我们希望有一种方便快捷的mock方式,便于开发测试使用,特别是对于多依赖、多变化的场景,更需要mock的协助。否则将需要打通一系列的外部依赖来满足一个场景的需要。

于是,我们推出了mock全链路。mock全链路既是一种mock方式,又是mock在不同阶段的扩展使用。当然 mock全链路还面临着一些些问题,我们将在后面的章节中详细展开。

二、技术背景

技术的进步更多源于底层技术,比如正是由于蒸汽机的发明,才有了现在各式各样的机动车,挖土机,收割机等等,工业上各种技术也有了不同形式的发展。同理,酒店mock也是伴随着基础架构、日志系统的更新换代而不断发展。

mock全链路就是在框架能够完整跟踪应用调用链,指定header在链路上无限透传,ES日志系统大范围应用的背景下产生的 。当然不管mock怎么变化,最基础的原理还是建立在常规mock的基础上的(如图1)。

640?wx_fmt=png

图1 常规mock示意图

首先在多依赖的应用中,特别是强依赖服务的业务逻辑比较复杂,依赖服务所在的组还有一堆任务的情况下,通过构造打通依赖服务的行为会变得非常耗时。严重的时候,会拖累整个项目的进度。

ES在公司的大规模应用,为我们解决此类问题提供了契机。ES的埋点数据为mock提供了很好的种子。框架的链路完整埋点为全链路提供最基础的管道,没有这个最基础的管道,所有的链路都将是模糊不清,无法识别的。同时 header在链路中的透传为整个mock实现铺平了道路,使得mock能够快速根据header中的规则来识别不同的链路调用。

测试的不同场景在这里也有了很好的区分。而这些数据又都可以在ES中通过埋点来解决。mock可以通过ES API把这些数据拉来使用,从而基础的API调用链路已经成形并且明晰。这就为后续的实现打下基础。

基础调用链路图如下:

640?wx_fmt=png

Es链路埋点如图2所示:

640?wx_fmt=png

图2 ES埋点链路示意图

当所有的链路设施都准备好之后,影响整个使用过程的就是怎么样把mock快速无缝的切入真实调用链路。

我们知道,无论是slb还是ip直连,最基本的原理还是所有的服务都需要注册,注册的最终目的就是所有的服务中心化。当调用依赖服务的时候,在中心里获取对方的服务,提供给调用方使用。

这样的情况下,应用切入mock最直接的想法就是把中心中依赖方地址修改成mock地址,当然这就需要框架提供支持。这是一种侵入式的mock应用方法。

另外一种方式是通过PROXY,类似于网络代理,所有经过代理的网络包在代理中进行收编和整理,该走mock的走mock,不走mock的放回原来的网络中。这种方式是当前相对比较理想的方式。把对应用的侵入,变成系统层面配置的更改,相对适应性更强一些。

综上两点解决后,整个mock链路的基本技术方案有了一个比较可行的落点。mock全链路的整体架构如图3。

640?wx_fmt=jpeg

图3 MOCK链路架构图

三、技术实现

Mock的技术实现要注意以下三点:

3.1 Mock的响应速度

响应速度要满足服务调用基本要求,不能timeout。正常情况下,mock不需要业务逻辑处理,只需要做规则的简单匹配,响应速度要快才对,这是建立在规则相对少的情况下。

如果在千万亿级的规则进来之后,规则的获取,场景的匹配速度会拖慢整个mock的响应,现在的mock系统同样要依赖缓存技术来提高规则场景的匹配速度。

另外是pb格式请求,我们要进行多次的序列化和反序列化,来保证配置的明文json或者xml能够正确的在请求中传递,而序列化和反序列化本身就是一个消耗cpu的动作,这会给响应造成极大的延迟。

当前情况下,我们尽量提前进行序列化和反序列化操作,操作结果存入缓存,这样能够在此等格式请求传递和返回传递的过程中,保持快速的字节流传递而不需要额外的序列化反序列化操作。

最后在转发的情况下,相对正常服务调用多了一次网络请求,时间消耗相对较长。在这方面我们尽量采用减少连接等待,保持连接状态等方式来减少多次socket连接造成的时间损耗。

3.2 契约依赖问题

对于依赖契约的请求格式,如pb等,需要契约的更新速度必须在ES埋点落库之前。

契约延迟更新是我们面临的很大问题,契约的不及时更新,会造成数据节点的丢失或者直接调用报错。发布订阅和编译包下载替换是我们目前解决这个问题的主要方式。

当前这需要维护一个所有应用契约文件的列表,以便我们在编译包中进行查找替换。而替换动作成功发生的前提是当前契约文件没有被进程占用。

3.3 系统操作的易用性  

操作简单是用户使用的基础,也是系统的目标,当然操作习惯也会影响系统在不同人群中的使用。但最终的目标,是希望用户用尽量少的鼠标或者键盘动作,来完成整个mock的操作。链路使用操作相对简单是系统能够被使用的重要环节。

譬如ES数据拉取,我们采用了只让用户输入ES共享链接来代替繁琐复杂的ES过滤器配置。

最原始的设计UI如下图所示:需要有十几个配置项需要用户取配置:

640?wx_fmt=png

改良后的交互如图4所示,只需要输入ES共享连接即可,其余的事情都由系统来协助用户完成,从而减少用户的使用费力度。

640?wx_fmt=png

图4 ES数据拉取

四、面临的一些问题

在mock全链路的使用过程中,遇到一些新的问题,比如在真实调用链中重复调用的问题。由于重复调用的返回结果不一致,导致我们在mock全链路的时候无法知晓哪个是第一次要返回,哪个是第二次要返回,从而影响全链路的真实性。

缓存问题。之前提到过很多应用都会在本地或者其他缓存服务器做数据缓存,很多处理逻辑是缓存数据存在的情况下,拉取缓存数据,否则走依赖接口调用,在mock切入应用之后,发现很多缓存未过期导致mock无法被调用,从而影响全链路的正确性。

转发302问题。有些服务需要在服务API之间做302转发调用,而mock正常是要返回http code 200的状态的。

针对不同业务的问题,我们只能针对性的进行个性化或者通用兼容性修补,在通用系统的基础上,进行个性业务适应。

总之,mock全链路系统需要在实际业务中进行不断的锻造、更新,在使用中不断调整,从而保证mock全链路能够适应不同业务的需要。

五、后记

Mock的设计特别要考虑压测的需求,压测对mock系统的要求会更高,所以我们在设计之初,要把这种需求优先考虑,对系统扩展和快速资源扩容留下足够的空间。

另外匹配规则的设计要尽量简单,譬如正则和xpath, jpath此类的功能,从当前的统计数据来看,使用率不高;而简单的规则,譬如header匹配,包含等则被用户大面积使用。


大数据与人工智能沙龙

8月24日上海

火热报名中

↓↓↓

640?wx_fmt=png

【推荐阅读】

640?wx_fmt=jpeg

全链路压测原理剖析(Coding) 全链路压测的原理,基本上可以用4个四字短语进行概括:流量分区、存储隔离、参数偏移、场景模拟。 阅读详情

相关推荐

在全链路压测平台的设计中mock服务

在全链路压测平台的设计中,mock服务是至关重要的,这是因为生产环境有很多服务是不能在全链路压测中被访问的: 1、第三方系统,例如我们在浏览商品下单购买的时候,不能真实付费完成商品的买卖,使用该部分需要调取mock服务从而可以完成业务流; 2、访问数据影响结果的功能,例如功能模块的埋点收集服务,如果我们全链路压测过程中增加了某些模块的访问次数,而这些模块的访问次数会通过埋点拿回到分析系统中,那么全链路压测过程中就要mock掉埋点服务,通过染色的请求来分流,真是请求被埋点服务收集,压测流两则进入mock服务

Criss@陈磊 889

干货 | 携程Mock本地化实践

作者简介Peter Sun,携程高级测试经理。一、引言这里说的Mock指的是系统测试或者接口测试场景下,模拟被依赖的其他服务接口进行响应返回的工具。测...

携程技术 528

达梦数据库与sharding-jdbc的深度适配实践

本文详细介绍了达梦数据库与sharding-jdbc的深度适配实践,包括驱动与依赖管理、核心适配实现、注册与配置等关键步骤。通过扩展shardingSphere的方式,成功实现了达梦数据库的分库分表功能,并提供了常见问题解决方案和性能优化建议,助力企业级应用高效处理海量数据。

weixin_30300225的博客 623

基于JavaAgent的Mock,流量回放,耗时分析,全链路监控(实现中)系统-简介篇

一. 背景 今天无心写代码,整理下文章看。应用对于第三方的依赖较多,由于第三方接口测试环境可靠性不高,容易导致测试人员测试堵塞;需要特定场景的数据,但是依赖相对复杂,伪造数据的成本较高等情况,对于接口,数据库,redis等Mock的需求还是比较大的。目前公司内部不同部门有多套Mock方案,但是都没有摆脱对代码的侵入,可扩展性不高。基于目前大部分服务已经是Java技术栈的前提情况下,通过JavaAgent修改字节码的方式达到Mock的目的的条件逐渐成熟,虽然该方案开发入门较高,但从可维护,推广简易,成本效益等

Rick的专栏 2825

手把手教你用Microsoft AEC Challenge数据集训练自己的回声消除模型(附完整代码)

本文详细介绍了如何使用Microsoft AEC Challenge数据集训练专业的回声消除模型,包括环境准备、数据清洗、模型架构设计、训练流程和实际部署注意事项。通过完整的代码示例和实战指南,帮助开发者快速掌握AEC技术,提升语音通信系统的回声消除效果。

weixin_27697385的博客 454

shader基于高度的权重混合

效果图: 基于高度的权重混合 , 效果描述: (1)混合:三层混合, 例如 第一层是草,第二层是石头,第三层是沙子,三者混合显示 (2)权重: 三层的权重的和 为1, 三者是此消彼长的关系 (3)高度:高度会限制或者说是 束缚 着 效果 关于混合,再多说几句: (1)基于权重的混合:权重 ,跟顺序没有关系 只跟权重的大小有关系(在一层一层界限不清晰的地方,特别适用!!效果极好!!!!) (2)基于叠加的混合: 叠加 就是 一层一层的往上加。。。。 所以顺序特别重要(在雪地等效果中使用:因为

木马人 1117

Mock服务的理解和搭建

Mock服务的理解和搭建

weixin_47391162的博客 1607

Windows Server下OnlyOffice Workspace社区版安装避坑指南(含局域网邮箱配置)

本文详细介绍了在Windows Server环境下部署OnlyOffice Workspace社区版的完整流程,特别针对企业内网环境中的邮箱配置和端口冲突等常见问题提供了实用解决方案。通过硬件资源配置建议、软件环境检查清单以及内网邮箱系统搭建方案对比,帮助用户高效搭建企业级协作平台,实现团队协作的无缝对接。

weixin_29231263的博客 449

干货 | 携程酒店DevOps测试实践

作者简介王幸福,携程酒店研发部高级测试经理,负责无线自动化测试相关工作。在测试框架和平台研发、移动测试、DevOps等领域有着丰富的经验。如今很多大型互联网公司、创新型企业都在积极地进...

携程技术 1900

[VT虚拟化驱动]正式启动VT

文章目录前言一、vmlaunch正式开始虚拟化二、使用步骤1.引入库2.读入数据总结 前言 本章开始真正实现一个最简单的VT框架,当然,只是能跑起来一个VT驱动了,没有并包括EPT,EPT后面再讲 提示:以下是本篇文章正文内容,下面案例可供参考 一、vmlaunch正式开始虚拟化 执行VMLAUNCH指令执行后,就正式进入虚拟化了,再该指令执行之前,得先保存Guest当前的环境,执行完VMLAUNCH后,要恢复Guest的环境,让Guest就像什么都没发生一样,所以需要保存和恢复Guest的各种寄存器的值

吾无法无天的博客 3661

如何在 UniApp 中接入讯飞语音听写功能 文末附vue3+vue2完整代码

在开发过程中,我遇到了讯飞接口返回空数据的问题。通过仔细检查传送的每一帧数据,我发现问题出在第一帧的配置信息以及 Base64 数据的切片。确保每一帧的数据正确且符合接口要求,问题就能够得到解决。希望这个过程能帮助你在项目中顺利对接讯飞语音识别。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 995

埋点测试和MOCK挡板

埋点测试 https://msd.misuland.com/pd/2884250103256718174 https://blog.youkuaiyun.com/alice_tl/article/details/78072830 https://www.cnblogs.com/kaibindirver/p/10404961.html https://www.jianshu.com/p/e3d987750f2b...

qq_22820783的博客 951

SAP BOM反查(可追溯值至顶级)

功能介绍:BOM层数在7层以内的(含7层)的物料,执行后都可以查询到顶级的BOM,逻辑很简单,后期如BOM层数增加,可自行增加查询逻辑。 *&---------------------------------------------------------------------* *& Report ZBOM_CHECK *&---------------------...

SAP阿狸 6060

mock测试_怎样用最简单的方式生成开发测试mock数据?

背景  在开发过程中我们经常会用到mock数据,为了使用mock数据,我们常常需要引入很多额外的工作,比如在本地使用静态json的方式需要我们手动创建很多json文件,再比如现在存在的一些mock服务,也需要我们手动做很多工作。当然繁琐的操作步骤也主要可能是因为我们所要开发的业务涉及的数据比较复杂,那么操作步骤比较多,使用形式比较多样也是合情合理的。不过我们也有很多时候并不需要特别复杂的...

weixin_39937412的博客 909

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的危险物品检测系统(深度学习模型+PySide6界面+训练数据集+Python代码)

随着公共安全需求的日益增长,危险物品检测技术在社会安防、交通安检等领域发挥着重要作用。本文介绍了一个基于YOLO系列深度学习框架的危险物品检测系统,集成了YOLOv8、YOLOv7、YOLOv6和YOLOv5四种先进的物体检测算法。系统采用PySide6开发了用户友好的图形界面,提供了完整的训练代码、预训练模型和数据集构建方案。实验结果表明,该系统在危险物品检测任务上实现了高精度和高实时性,为实际应用提供了可靠的技术支持。

YOLO 156

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

性能测试的价值、全链路压测了解

一、有价值的性能测试需要满足什么 1. 性能测试与性能分析要有明确的数据证明调优的效果。 性能测试人员/团队要有能力给运维一份性能测试报告+配置文档+风险说明。 2. 性能测试与性能分析的价值要体现在有效的节约成本中。 既测又调并且调得有效果,能直观反馈在成本数据上。 二、性能测试在软件生命周期中的位置 三、什么是全链路压测 基于实际的生产业务场景、系统环境,模拟海量的用户请求和...

xianjie0318的博客 4977

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Google Mock 启蒙篇

Google Mock 入门译文重排版:修正 OCR 乱码和代码块,补上 2026 编者注、MOCK_METHOD 新旧写法对照,以及官方 googletest 仓库接入方式。

左手是诗,右手是代码。 5630

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Mock Server实践

背景 在美团服务端测试中,被测服务通常依赖于一系列的外部模块,被测服务与外部模块间通过REST API或是Thrift调用来进行通信。要对被测服务进行系统测试,一般做法是,部署好所有外部依赖模块,由被测服务直接调用。然而有时被调用模块尚未开发完成,或者调用返回不好构造,这将影响被测系统的测试进度。为此我们需要开发桩模块,用来模拟被调用模块的行为。最简单的方式是,对于每个外部模块依赖,都创建一套桩模块。然而这样的话,桩模块服务将非常零散,不便于管理。Mock Server为解决这些问题而生,其提供配..

一个有情怀的程序猿博客 1706

干货 | 携程酒店RSocket实践

作者简介刘诚,携程酒店研发性能架构师。2014年加入携程,致力于通过架构的演进,控制企业硬件成本。一、初识RSocket在QCon2019北京大会上第一次得知RSocke...

携程技术 1892

有关Mock接口测试,python+ flask 实战

模拟接口接口Mock测试:在接口测试中,对于某些不容易构造或者不容易获取的接 口,可以用一个模拟接口来代替1、依赖的接口未实现2、依赖的接口响应速度慢3、针对接口模拟各种异常1、可以用来解除测试对象对外部服务的依赖,使得测试用例可以独立运行2、模拟异常逻辑,异常逻辑往往很难触发,通过Mock可以人 为的控制触发异常逻辑3、 团队可以并行工作接口mock实现的核心思想是搭建一个Mock Server,通过该服务提供mock接 口1、使用第三方mock平台 ---》Moco2、自己开发mock服务 3、

qq_39270023的博客 1075

压测的一些思路

时机 首先要清楚的一点就是,什么时候开始做全链路压测?我们有另外一个业务线,现在就没有打算做,那个业务线的日均单不到十万,而要压测的业务线的日均单到了200万,但这并不意味着200万是一个标准,我觉得可以从下面几点考虑: 业务发展速度。在可以预期的一段时间(最好是半年,一个季度有点...

chuizhuquan8731的博客 744

关于埋点

本文主要介绍 火球买手 项目上的埋点方案(基于神策),以及一些心得。事实上在项目早期,我们的埋点完全依赖于第三方的全埋点技术,客户端开发人员只需要做一些简单的工作就能满足 BI 部门对数据的需求。但随着业务增长,对数据的准确性和精细化的要求越来越高,之后不得不转向手动埋点,当然这个也是基于第三方的。 目前 BI 部门对埋点数据要求可以总结...

weixin_33881140的博客 385

Mockito如何mock一条链式调用

在写单元测试的时候,不免可能需要mock一些对象出来,并且mock一些方法调用去返回一个自己想要的对象。一般的使用是这样的: FinalPumpkin pumpkin = mock(FinalPumpkin.class); when(pumpkin.getName()).thenReturn("www.pkslow.com"); 这样我们便可以自定义这个类getName()方法的返回,以达到我们测试特定情况的需要。 但假设可能我们要影响的是下面这样的返回结果呢? pumpkin.getW

南瓜慢说 3934
上一篇: 干货 | 携程酒店RSocket实践
下一篇: 沙龙回顾 | 敏捷总动员,含PPT和视频
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值