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

news2024/12/27 10:04:28

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

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中)即该录制任务下录制的记录总数。

属性名示例值示例值
idRT7625109167934456_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体
recordTaskNoRT7625109167934456所属录制任务编号
timestamp1636719778929时间戳
4.2.3 流量回放

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

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

4.2.4 流量压测

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

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

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

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

1)计算窗口

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

2)按窗口滑动

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

5 业务实践

5.1 切量验证

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

5.2 需求迭代

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

作者:京东物流 朱永昌

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

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

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

相关文章

XSS原理

原理: 这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里嵌入恶意代码。当用户浏览改页时,这些潜入在HTML中的恶意代码会被执行,用户浏览器被攻…

串联起深度学习的整体,以及其他领域

1、从模型拟合(收敛)数据关系出发: 2、f从简单的一层和两层连接开始,发展;被表示成 3、如何判断收敛:,即目标函数 4、如何界定任务:,表示什么?表示什么?&a…

解决ubuntu中没有网络连接的图标

现象:Ubuntu连接网络 在设置中没有显示网络图标 解决方案: 命令为 sudo nmcli networking off sudo nmcli networking on sudo service network-manager restart 重启ubuntu,网络连接完成

[MongoDB]-权限验证管理

[MongoDB]-权限验证管理 senge | 2023年9月 背景说明:现有两套MongoDB副本集群给开发人员使用时未开启认证。 产生影响:用户若输入账号以及密码则会进行校验,但用户可以在不输入用户名和密码的情况下也可直接登录。 倘若黑客借此进行攻击勒索…

nSoftware IPWorks IoT 2022 Java 22.0.8 Crack

物联网库,使用这个轻量级组件库,可以在任何平台上的应用程序中轻松实现物联网 (IoT) 通信协议。 nSoftware IPWorks IoT 最新的 IPWorks IoT 现已推出!最新版本的 IPWorks IoT 具有现代化和简化的体验,包括 .NET 中的异步和跨平台…

LeetCode竞赛---第 366 场周赛

Problem: 100103. 分类求和并作差 📚 题目:给你两个正整数 n 和 m 。 现定义两个整数 num1 和 num2 ,如下所示: num1:范围 [1, n] 内所有 无法被 m 整除 的整数之和。num1:范围 [1, n] 内所有 无法被 m 整…

OPPO realme 真我 一加 刷机工具下载 ColorOS Upgrade Tool

Download Realme Upgrade Tool for Windows Download ColorOS Upgrade Tool for Windows Realme升级工具是由Realme开发的Windows应用程序,可帮助用户升级其Realme设备上的固件。此工具支持在Realme Ul 3.0或更高版本上运行的Realme 设备。OPPO realme 真我 一加 …

下载安装JRebel插件

settings -> plugis -> JRebel 下载 然后重启idea 激活 现在呢,2023年啦~所以网址得是最先哒~ http://127.0.0.1:8888/{GUID} GUID从下面的网址生成,邮箱随意~ Create GUID online (guidgen.com) LS client not configured. 删除用户文件夹…

C++ | 仿函数

仿函数的用法 在C语言时期,如果想要实现回调函数或者是函数参数需要传入函数,通常是用的函数指针。而在C中,我们一般用仿函数来平替。 仿函数,又叫函数对象。虽然名字叫仿函数,但本质上就是一个重载了 operator() 的类…

金融信创黄金三年:小程序生态+跨端技术框架构建

小程序应用场景生态的发展,受益于开源技术的发展,以及响应快速开发的实际业务需求,一些跨端框架如:Electron、wxPython、FinClip、Tauri、Flutter等发展也非常迅速,小程序生态跨端技术框架,不仅能满足自有超…

Python3操作文件系列(三):OpenPyXl模块三大对象操作Excel文件

Python3操作文件系列(一):判断文件|目录是否存在三种方式 Python3操作文件系列(二):文件数据读写|二进制数据读写 Python3数据文件读取与写入 Python3操作文件系列(三):excel文件读写数据 Python操作Excel的三大对象认知升维: Excel对象模型:excel脚本编程的主要…

Idea热部署插件(JRebel for IntelliJ)激活(适用于内网、外网激活)

一.下载激活需要的Jar包 网盘地址: 链接:https://pan.baidu.com/s/1BYS9rE_3EA_isFfz8ORRDg 提取码:1i0c二.进入到第一步下载的jar目录下,运行cmd并且通过java-jar运行jar包 三.运行jar后,将激活地址复制到idea上&a…

docker基本用法

docker 基础常用命令 导入镜像 方式1 docker import kylin_sp2.tar.xz kylin-build:build-hs-220824方式2 [rootccc64 caojingjing]# cat kylin_sp2.tar.xz | docker import - kylin-build:build-hs-220824 sha256:c02cba7686b88e633eff58cddba3189712cbe7f449f2fd37b2033158a…

【JUC系列-10】深入理解ArrayBlockingQueue的底层原理

JUC系列整体栏目 内容链接地址【一】深入理解JMM内存模型的底层实现原理https://zhenghuisheng.blog.csdn.net/article/details/132400429【二】深入理解CAS底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132478786【三】熟练掌握Atomic原子系列基本…

什么是研发效能DevOps?研发效能方程式又是什么?

研发效能DevOps是一种理念一个方法,旨在通过优化软件开发、运营和维护的流程,实现高效、高质量、快速的价值交付。 研发效能需要解决的是:如何平衡价值、效率、成本这三者的关系,同时寻求可持续发展。研发效能的目标是持续低成本…

多因素共同作用,行业格局或将发生变化

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 1、政经环境改善,数控机床有望走出寒冬 近年来,国家不断提高对于高端数控机床的扶持力度与关注。长…

高效解决 TypeError : ‘ numpy._DTypeMeta‘ object is not subscriptable 问题

文章目录 问题描述解决问题 问题描述 解决问题 参考博文 打开报错位置 AppData\Roaming\Python\Python39\site-packages\cv2\typing\ 添加single-quotes,即单引号 博主说The trick is to use single-quotes to avoid the infamous TypeError: ‘numpy._DTypeMeta’…

ChatGPT可以用于写留学文书嘛?对留学生有什么影响?

自从4月份ChatGPT4.0发布以后,越来越多的AI工具被应用于我们的日常生活当中,而对于学生来说,尤其是在读的留学生朋友,或多或少都使用过,无论是写文章综述还是项目总结,都有十分出色的效果。 01.ChatGPT 可…

算法题:买卖股票的最佳时机含手续费(动态规划解法贪心解法-详解)

这道题有两种解法:动态规划 or 贪心算法。 贪心算法的提交结果要比动态规划好一些,总体上动态规划的解法更容易想到。(完整题目附在了最后) 1、动态规划解法 设置两个数,dp[0]表示遍历到股票prices[i]时手里没有股…

SSM整合RabbitMQ,Spring4.x整合RabbitMQ

SSM整合RabbitMQ目录 前言版本实现目录参考pom.xml依赖rabbitmq.properties配置文件spring-rabbitmq.xmlspring-mvc.xml或applicationContext.xmlrabbitmq目录下MessageConsumer.javaMessageConsumer2.javaMessageProducer.javaMessageConstant.java 测试调用 扩展消息重发 前言…