全场景流量验证系统 | 京东物流技术团队

京东云开发者
• 阅读 442

本文介绍了一种基于线上流量实现对重构系统进行功能和性能验证的实践方案。针对线上流量如何拦截、如何录制、如何存储、如何回放以及如何发压均作了详细说明,为具有类似需求的读者提供了一种可供参考的思路。

1 业务背景

随着百川项目的启动,中台需要对订单流量收口,将ECLP、各BP的接单入口全部切换至百川统一接单系统。且各个接单入口调用方式各异,有JOS请求(外部商家)、JSF请求(如TC),也有MQ异步消息(如POP)。为了确保各系统平稳切量,最大程度降低切量风险,需要在切量前做充分的流量验证(包括功能验证和性能验证)。为此,设计了一套全场景流量验证系统,支持基于线上流量的AB验证(功能验证)、压测(性能验证),为各业务线接单切量工作提供了可靠的基础支撑。

2 名词解释

  • 引流:把各个接单入口所在系统的线上流量引入到流量验证系统。
  • 录制:复制线上流量并做持久化存储。
  • 回放:把录制的流量打到待验证系统。
  • 切量:把接单流量从ECLP等老的接单系统切换到新的百川统一接单系统中。
  • AB验证:线上流量同时打到正式环境和AB环境,对两个环境的结果做对比分析,验证AB环境的正确性。

3 设计思路

如何引流?
可以在业务系统中引入流量代理的方式实现引流。

如何录制?
考虑需要支持大数据量以及复合查询,选择使用ES作为持久化存储方案。

如何回放?
为避免对各业务系统Jar包依赖,选择使用JSF泛化调用实现流量回放。

是否有类似的系统可用?
月光宝盒(jcase):由京东零售开发的一款流量录制回放系统。其支持流量录制、回放功能,但是并不能满足一些个性化的需求,比如按自定义业务规则录制、切量控制等。

4 系统设计

4.1 总体设计

流量代理:通过拦截、过滤、上报将流量引流到验证系统中。
录制服务:接收流量代理引入的线上流量并做持久化存储。
回放引擎:使用录制的线上流量请求待验证目标接口。
压测引擎:使用录制的线上流量向待验证目标接口实现多线程发压。

全场景流量验证系统 | 京东物流技术团队

4.2 详细设计

4.2.1 流量代理

1)通用流量代理

全场景流量验证系统 | 京东物流技术团队

在业务系统中引入流量代理,通过流量代理拦截(JSF Filter或AOP)线上流量,并将流量通过异步MQ方式上报给录制服务做持久化存储。

2)JOS流量代理

全场景流量验证系统 | 京东物流技术团队

外部商家通过HTTP方式调用JOS平台,JOS平台内部转JSF调用接单服务。为使外部商家无感,发布一个和业务系统接口完全相同的JSF服务(虚服务),不同的是提供一个新的别名,通过JOS平台配置切换到新的别名,这样就把JOS流量引入到了录制代理,然后再由录制代理通过异步MQ方式将流量上报给录制服务做持久化存储。

4.2.2 流量存储

录制的流量持久化存储到ES,按照[接口:方法]维度创建录制任务,同一个录制任务下的记录主键均以录制任务编号为前缀,后缀为数字递增,最大后缀(缓存到Redis中)即该录制任务下录制的记录总数。

属性名 示例值 示例值
id RT7625109167934456_1 主键标识
recordData {"args":[{"fakeNo":"fakeNo001"}],"argsType":["cn.jdl.baichuan.router.replay.contract.domain.fake.FlowFakeRequest"],"attachments":{"traceId":"8112206384546625","type":"1"},"clazzName":"cn.jdl.baichuan.router.replay.contract.service.RouterFlowFakeService","methodName":"match","resultObj":true} 录制的body体
recordTaskNo RT7625109167934456 所属录制任务编号
timestamp 1636719778929 时间戳

4.2.3 流量回放

支持单条、批量、按录制任务维度批量回放。回放调用采用JSF泛化调用方式,避免了对业务系统Jar包的依赖。

流量回放的同时,支持配置对比服务,对比服务接收入参以及新老接口的出参结果,可以对新老接口处理结果进行对比分析,以验证新接口功能的正确性。

4.2.4 流量压测

为了实现发压的效果,需要采用多机、多线程并发的方式请求目标接口。但是多机、多线程共用了同一份录制数据作为压力数据源。因此,在真正发压之前,需要为每个执行线程分配好数据,各个线程只取自己的数据,互不干扰。

发压策略(主从架构,Master分配,Slave执行)

全场景流量验证系统 | 京东物流技术团队

压测引擎采用主从架构,压力机分主从节点,主节点负责接收压测请求并分配压测任务;从节点负责执行压测任务。

数据分配策略(按量平均,余数轮询,滑动窗口)

全场景流量验证系统 | 京东物流技术团队

1)计算窗口

按录制任务中录制总量,平均分配到各个线程,余数再按轮询方式分配给每个线程,分完为止,这样可以确定出每个线程分配的记录条数(窗口大小);

2)按窗口滑动

将所有录制任务从左到右水平平铺,每个线程按照自己窗口大小从左到右依次占用录制记录。

5 业务实践

5.1 切量验证

以仓配POP接单接口切换为例,我们需要用新的订单中心替换原来的ECLP-SO系统。在正式切换之前,仍然由ECLP-SO系统提供线上接单服务,但同时会通过流量验证系统录制线上流量并回放到新的订单中心。通过对比新老系统对相同接单请求的处理结果,验证新的订单中心的接单功能。经过充分功能验证后才会将接单流量切换到新的订单中心,从而极大降低了切量的风险。

全场景流量验证系统 | 京东物流技术团队

5.2 需求迭代

产品校验服务是产品中心对外提供的一个核心接口,接口逻辑复杂,每一次需求迭代上线都面临极大挑战。即便是经过了测试环境、预发环境验证,依然不能百分百保证上线后对线上业务没有影响。毕竟测试环境、预发环境的验证请求参数单一且有限,无法反映线上请求的多样性和复杂性。因此,产品中心接入了流量验证系统,每次有新的需求迭代上线前,首先录制线上流量,使用线上真实流量在预发环境进行充分验证后再做上线操作。这样极大降低了由于验证不充分,导致线上业务受损的几率,为线上业务提供了一层安全保障,提高了线上系统稳定性。

作者:京东物流 朱永昌

来源:京东云开发者社区 自猿其说Tech 转载请注明来源

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Wesley13 Wesley13
3年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
3个月前
大促高并发系统性能优化实战--京东联盟广告推荐系统
当一个推荐系统面临高频、瞬时、大幅的流量突变时,如何在维持稳定性的同时,最小化推荐效果损失?背景618对京东来说是一场重要的营销盛会,大促将为业务各个层面带来爆发式增长。然而,超大规模的流量洪峰也对京东各系统提出了严峻考验。京东联盟是京东的联盟营销平台,主
京东云开发者 京东云开发者
2个月前
买药秒送 JADE动态线程池实践及原理浅析
一、背景及JADE介绍买药秒送是健康即时零售业务新的核心流量场域,面对京东首页高流量曝光,我们对频道页整个技术架构方案进行升级,保障接口高性能、系统高可用。动态线程池是买药频道应用的技术之一,我们通过3轮高保真压测最终初步确定了线程池的核心参数。但我们仍面
京东小程序数据中心架构设计与最佳实践 | 京东云技术团队
小程序平台是怎么保证商家业务的稳定、健康发展,服务好这些外部商家的呢?这里面非常重要的是我们平台对小程序基本流量的运营与监控。如何不让业务的小程序在线上裸奔?如何帮助业务对自身小程序流量的冲高回落有一种直观的把握和监测?如何基于海量数据指导业务去进行一个精细化的运营?实际上,京东小程序数据中心就扮演了一个这样的小程序数据问题终结者的角色,充分利用各类数据手段,解决这些痛点问题。
曼成 曼成
8个月前
一文教你如何在小程序中快速接入验证码短信API
在微信小程序中接入验证码短信API,可以为用户提供便捷的验证服务。本文将详细介绍如何在小程序中实现这一功能,包括UI设计、API请求以及代码实现。
京东云开发者 京东云开发者
4个月前
研发视角浅谈R2流量回放测试
一、背景测试小伙伴们在2023年保障了团队线上系统0问题,这简直就是一项了不起的壮举!这得益于咱们测试组同事对工作的细致投入、风险把控、以及严格遵循流程规范进行测试用例评审、自动化建设、联调推动、回归验证、常态化压测、大促高保真压测、引流回放等多重保险策略