当前位置: 首页 > news >正文

promise时效架构升级方案的实施及落地 | 京东物流技术团队

一、项目背景

为什么需要架构升级

  • promise时效包含两个子系统:内核时效计算系统(系统核心是时效计算)和组件化时效系统(系统核心是复杂业务处理以及多种时效业务聚合,承接结算下单黄金流程流量),后者依赖前者,分别由两组技术团队支持;因为有些业务的渗透造成两个系统的边界越来越不清晰;有些需求从PRD评审到项目上线,需要两组研发全程参与,耗费大量人力;
  • promise时效计算业务逻辑经过多年的沉淀越来越复杂,时效计算系统中有很多业务逻辑,导致计算内核也需要跟随需求频繁更新;
  • 时效计算分为预约和非预约,下单前和下单后,结算页时效和商详页时效。有共性也存在差异,导致共用一部分内核计算的同时存在大量冗余重复代码,需要同时维护和存储两份时效计算的缓存数据。
  • 多种业务从内核系统中提供专用接口,导致系统严重腐化。
  • 存在部分未采用RPC方式的依赖,导致jar包依赖和时效计算的切量开关需要配置在组件化时效系统中,影响开发和联调效率。

综上,决定这次技术驱动的重构,需要架构升级解决系统中存在的问题。

重构目标

业务边界更清晰

重构之后的需求边界从产品侧就能够确定,如果新增仓配时效计算规则需要修改或新增内核计算,其他业务的需求基本组件化时效中修改即可;

业务逻辑更聚合

组件化中整合业务逻辑;

内核计算逻辑更纯净

一套时效计算缓存,节省一半硬件资源费用;

增加系统复用性,一套计算模式同时支持预约和非预约两种模式,支持结算和商详,下单前和下单后的场景;维护一套内核计算逻辑代码,与具体业务分离,节省更多人力资源;

二、方案设计

内核计算业务梳理

现有业务接口:

  • 标准达日历:考虑控单,产能,大宗禁止 标准达日历
  • 京准达日历:考虑控单,产能,大宗禁止 京准达日历
  • 无人车日历:无人车日历 仓自提/无人车日历
  • 仓自提日历:仓自提日历,不走干支线 仓自提/无人车日历
  • 自提日历:获取自提点四级地址,考虑控单,产能,大宗禁止 标准达日历
  • Vxp日历:考虑控单,节假日,大宗禁止,不考虑产能,固定最大天数和可选天数 标准日历
  • 7Fresh日历:标准达日历计算完成后根据门店波次替换日历波次 标准达日历
  • 全球购报税日历:加上全球购报税备货buffer后走标准达日历计算 标准达日历
  • B2B日历:B2B日历计算
  • 夺宝岛日历:夺宝岛日历计算

根据业务特点,**将原来的8种业务时效计算接口聚合为3个核心通用计算接口,消除了5种业务的特殊处理接口。**重新定义设计新的内核计算接口:京准达时效、标准时效、仓自提时效。减少了大量重复代码,避免改一个需求就要改好多相同的地方,便于统一管理。

新core系统三个核心接口方法可以为多个业务系统提供服务

系统重构相关业务如下图所示,

主要变更点:

  • core接口聚合,组件化系统适配,补充处理前置信息;
  • 重构之前控单接口的调用和产能逻辑分散在组件化时效和base系统中,重构后产能提供新接口,控单和产能逻辑从core系统剥离,集中到组件化时效系统中;
  • 大宗商品、二级仓、全球购清关、VXP节假日等业务逻辑上浮到组件化系统,减少了系统间报文大小和接口复杂度;

系统重构业务

三、项目实施

组件化业务梳理

  • 考虑产能
  • 考虑控单
  • 考虑走干支线
  • 判断是否大宗
  • 新增全球购清关时长加buffer
  • 新增产能白名单
  • 新增产能白名单打标
  • 新增自提波次格式转换
  • 新增二级仓出参信息整合
  • core新接口转单据类型
  • 节能补贴增加默认buffer
  • 增7鲜门店波次转换
  • 新增全球购多仓屏蔽逻辑

组件化时效中对新接口进行适配,可用切量开关进行控制

四、稳定性保障

怎样保证系统重构的安全性和准确性,重构前后一致性验证上线前主要有两种方式:单测覆盖和流量回放验证;上线后通过多维度切量开关进行控制,保障系统的稳定性。

上线前

  • 单测场景覆盖

1700+个测试用例,覆盖大部分单一业务场景和部分组合业务场景。

  • 流量回放验证

通过实时引流线上流量,回放到重构后的系统中。流量回放过程中发现差异,分析具体原因,发现多个重构测试用例未覆盖到的复杂场景问题。

eg.全球购商品满足城配转普通时效走大宗时效的场景:正常逻辑是①全球购商品命中了城配逻辑;②全球购不支持城配时效,需要转普通时效;③转成普通时效后又命中大宗业务场景。重构时从①走到了③,城配时效和大宗时效是互斥的,所以无法转换成大宗时效,调整转换逻辑后导致和重构前时效不一致,这种场景负责涉及业务配置很多,很难通过测试用例覆盖,流量回放验证是很好的验证方案。

  • 流量回放自定义对比差异

由于系统架构调整以及新接口的设计和老架构存在差异,导致采购、全球购、控单等业务场景下返回的起始日历日期不一致,实际可用日历和波次是一致的,所以这种是预期内的差异,导致流量回放时diff率较高,页面配置的忽略字段无法满足我们的需求;

首次采用自定义脚本进行差异对比,自定义实现排序和忽略项设置,将不影响时效的差异对象忽略掉,减少diff干扰。

  • 业务方案确认

对未通过测试用、流量回放差异,研发测试分别列出清单,研发、测试、产品组会进行沟通,对系统现状和业务影响范围进行评审,确定最终处理方案。

测试中发现的问题验证修复后,确认达到业务要求和上线标准,才可以灰度上线。

上线后

灰度发布时,只接入一小部分流量,并及时跟踪和分析线上的 log 与监控告警,并关注用户反馈一有问题及时解决。当新系统趋于稳定时,逐渐加大灰度发布的范围和接入的流量,同时继续跟踪线上 log 与监控告警。

  • 白名单验证

上线后用白名单用户进行验证。

  • 流量切换控制

系统上线后,支持用户PIN的百分比进行切量,灰度验证实现平稳过渡。

  • 组件切换开关

新老逻辑组件可以一键切换,如发现问题可快速切回原逻辑,快速止损,保证线上系统安全;

五、项目价值

系统优化

  • 按项目预期实现了全新纯净的时效内核计算接口,内核系统具有更高的复用性;
  • 组件化系统中重新组织部分逻辑,增加上浮的业务逻辑。系统逻辑更聚合,提升易读性、减小了系统维护成本;
  • 降低上线风险,重塑业务边界后,交互系统逻辑更集中,减少了相互依赖配置,更利于把控风险;
  • 重构修复测试用例和引流验证时,发现并修复多个线上BUG,保障并提高了系统的稳定性;

◦ 测试用例发现5个BUG,修复遗漏边缘业务逻辑和处理逻辑错误等问题;

◦ 流量回放中发现7个BUG,修复530标位、京准达时效类型等线上bug;

  • 修正40+个测试用例;

遇到的困难

系统重构总能留下比较深刻的印象,不仅会碰到技术的挑战,需要思考用什么方案更合理;也会碰到难以理清的业务逻辑,需要将产品、研发、测试摇到一起追思忆往;还会发现历史的“bug”,让人纠结要不要“更正”;都很耗费发量。

1、流量回放阶段,由于出参数据填充方式变化,导致无法比较,通过自定义脚本的方式解决。

2、自提时效多仓场景新架构无法支持,协同产品、业务优化原有多仓场景的处理方式,既解决问题又优化了线上处理逻辑。

项目总结

重构有利于项目的健壮和精简,平时要养成重构的好习惯,“小步快走”,尽量避免留着统一重构的思想,积累很多技术债后重构精力、时间成本很大,风险也会大很多。如果重构任务艰巨,需要提前做好迭代计划,重构方案设计之初就要考虑如何分阶段实施,小步快走层层分离的策略就相当于搭建施工现场的脚手架,是一种把风险控制在可接受范围的有效手段。更多关注“明天价值”,当发现好的数据结构、好的思想的时候,甚至一个变量名或方法名,把以前写的代码重写一下;

何时进行重构最好遵循“三次法则”,如果一件事需要做一两次,可以不着急重构;但是如果需要重复三次甚至以上的话,就该考虑着手去重构了,保持系统的健康状态。

公司业务在快速发展中,系统重构期间,需继续保持业务需求的迭代速度,可以适当增加人员。

系统重构前需要对业务足够熟悉(包括边缘业务),重构时可能会遇到看着重构代码一样,实际代码的执行顺序影响业务的前后依赖或优先级,最后影响结果的输出,在复杂的业务处理流程中很难发现问题。

上线后跟踪系统运行实际性能变动、资源消耗、稳定性。重构中发现了系统中存在相似的业务处理逻辑、城配相关的逻辑过于复杂等问题,下一步与产品业务沟通是否可以进行精简,重构不是终点,更像是起点。

作者:京东物流 崔海君

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

相关文章:

promise时效架构升级方案的实施及落地 | 京东物流技术团队

一、项目背景 为什么需要架构升级 promise时效包含两个子系统:内核时效计算系统(系统核心是时效计算)和组件化时效系统(系统核心是复杂业务处理以及多种时效业务聚合,承接结算下单黄金流程流量)&#xff…...

es的使用方法以及概念

Elasticsearch(简称为ES)是一个开源的搜索引擎,它构建在Lucene搜索引擎之上。它提供了一个分布式、多租户的全文搜索引擎,具有强大的实时分析能力。以下是关于Elasticsearch的一些基本概念和使用方法: 基本概念&#…...

WPF xaml Command用法介绍

WPF (Windows Presentation Foundation) 中的命令设计模式是一种用于分离用户界面逻辑和业务逻辑的方法。在WPF中,这种模式通过命令接口(如 ICommand)实现,使得用户界面组件(如按钮、菜单项等)可以触发不直…...

微信小程序动态生成表单来啦!你再也不需要手写表单了!

dc-vant-form 由于我们在小程序上涉及到数据采集业务,需要经常使用表单,微信小程序的表单使用起来非常麻烦,数据和表单是分离的,每个输入框都需要做数据处理才能实现响应式数据,所以我开发了dc-vant-form,…...

顺序表(数据结构与算法)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿&#x1…...

【大连民族大学C语言CG题库练习题】——判断一个矩阵是另一个矩阵的子矩阵

【问题描述】 从标准输入中输入一个N&#xff08;N<9&#xff09;阶矩阵和一个M&#xff08;M<N&#xff09;阶矩阵&#xff0c;判断矩阵M是否是N的子矩阵&#xff0c;若是则输出M在N中的起始位置&#xff0c;若不是则输出-1。若矩阵M能与N中某一区域完全相等&#xff0…...

C#WPF控制模板实例

一、控制模板 ControlTemplate(控件模板)不仅是用于来定义控件的外观、样式, 还可通过控件模板的触发器(ControlTemplate.Triggers)修改控件的行为、响应动画等。 控件模板定义控件的视觉外观,所有的 UI 元素都具有某种外观和行为,例如,Button 具有外观和行为。单击事件或…...

MATLAB Simulink和S7-1200PLC MOBUSTCP通信

MATLAB Simulink和SMART PLC OPC通信详细配置请查看下面文章链接: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读749次,点赞26次,收藏2次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的…...

五、函数的介绍

1、为什么需要函数 (1)当程序足够简单时&#xff0c;一个main函数就可以实现所有功能。随着程序功能的增加、复杂化&#xff0c;超出人的大脑的承受范围&#xff0c;这时一个main函数可能就逻辑不清了。这是就需要把一个大程序分成许多小的模块来组织&#xff0c;于是乎出现了…...

【广州华锐互动VRAR】VR元宇宙技术在气象卫星知识科普中的应用

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;和元宇宙等技术正逐渐走进我们的生活。这些技术为我们提供了一个全新的互动平台&#xff0c;使我们能够以更加直观和生动的方式了解和学习各种知识。在气象天文领域&#xff0c;VR元宇宙技术的应用也日益显现…...

F. Alex‘s whims Codeforces Round 909 (Div. 3) 1899F

Problem - F - Codeforces 题目大意&#xff1a;有q次询问&#xff0c;每次询问给出一个数x&#xff0c;要求构造一棵n个点的树&#xff0c;使得对于每次询问&#xff0c;树上都有一条简单路径的长度等于x&#xff0c;同时每次询问前可以对树进行一次操作&#xff0c;即将一个…...

面试题-5

1.用递归的时候有没有遇到什么问题&#xff1f; 如果一个函数内可以调用函数本身,那么这个就是递归函数 函数内部调用自己 特别注意:写递归必须要有退出条件return 2.如何实现一个深拷贝 深拷贝就是完全拷贝一份新的对象,会在堆内存中开辟新的空间,拷贝的对象被修改后&…...

车载以太网-ARP

文章目录 车载以太网ARP协议ARP协议帧格式ARP报文示例ARP报文完整流程ARP流程报文示例ARP协议测试 车载以太网ARP协议 车载以太网ARP协议是指在车载以太网中使用的ARP协议。ARP&#xff08;Address Resolution Protocol&#xff09;是一种用于将IP地址解析为MAC地址的协议。在…...

Kafka学习笔记(三)

目录 第5章 Kafka监控&#xff08;Kafka Eagle&#xff09;5.2 修改kafka启动命令5.2 上传压缩包5.3 解压到本地5.4 进入刚才解压的目录5.5 将kafka-eagle-web-1.3.7-bin.tar.gz解压至/opt/module5.6 修改名称5.7 给启动文件执行权限5.8 修改配置文件5.9 添加环境变量5.10 启动…...

JVM-HotSpot虚拟机对象探秘

目录 一、对象的实例化 &#xff08;一&#xff09;创建对象的方式 &#xff08;二&#xff09;创建对象的步骤 二、对象的内存布局 &#xff08;一&#xff09;对象头 &#xff08;二&#xff09;实例数据 &#xff08;三&#xff09;对齐填充 三、 对象的访问定位 &…...

大模型技术的发展:开源和闭源,究竟谁强谁弱又该何去何从?

一、开源和闭源的优劣势比较 开源和闭源软件都有各自的优劣势&#xff0c;具体比较如下&#xff1a; 安全性&#xff1a;闭源软件的安全性相对较高&#xff0c;因为其源代码不公开&#xff0c;攻击者难以找到漏洞进行攻击。而开源软件由于源代码公开&#xff0c;容易被攻击者发…...

Python学习笔记--自定义元类

四、自定义元类 到现在&#xff0c;我们已经知道元类是什么鬼东西了。 那么&#xff0c;从始至终我们还不知道元类到底有啥用。 只是了解了一下元类。 在了解它有啥用的时候&#xff0c;我们先来了解下怎么自定义元类。 因为只有了解了怎么自定义才能更好的理解它的作用。…...

软件测试 —— 常见的自动化测试架构!

一个自动化测试架构就是一个集成体系&#xff0c;其中定义了一个特殊软件产品的自动化测试规则。这一体系中包含测试功能函数库、测试数据源、测试对象识别标准&#xff0c;以及各种可重用的模块。这些组件作为小的构建模块&#xff0c;被组合起来代表某种商业流程。自动化测试…...

Python 的 @lru_cache() 装饰器

在 Python 标准库的 functools 模块中&#xff0c;有个 lru_cache 装饰器&#xff0c;用于为一个函数添加缓存系统&#xff1a; 存储函数的输入和对应的输出当函数被调用&#xff0c;并且给出了已经缓存过的输入&#xff0c;那么函数不会再运行&#xff0c;而是直接从缓存中获…...

Swift制作打包framework

新建framework项目 设置生成fat包&#xff0c;包括模拟器x86_64和arm64 Buliding Settings -> Architectures -> Build Active Architecture Only 设置为NO 设置打包环境&#xff0c;选择release edit Scheme -> run -> Build configuration 设置为 Release 设置…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...