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

SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)

目录

  • 一.背景
    • 1.1 业务背景
    • 1.2 技术负债
  • 二.技术目标
  • 三.方案设计
    • 3.1 解决移动端频繁发版
      • 3.1.1 场景分析
      • 3.1.2 技术方案
    • 3.2 减少后端坏味道代码&无法灵活扩展问题
      • 3.2.1 通过抽象接口完成各自单独楼层渲染逻辑
      • 3.2.2 通过配置能力做到部分字段可配
  • 四.升级上线(普适于高并发大流量的业务场景的功能上线更新)

专栏系列

-SaaS 电商设计 (一) 如何设计一套适应多规格的商品服务
-SaaS 电商设计 (二) 私有化部署-缓存中间件适配
-SaaS 电商设计 (三) 电商黄金流程(商详,购物车,提单)梳理,持续更新(建议收藏)
-SaaS 电商设计 (四) 谈一谈电商系统高并发多耦合上下游的系统压测怎么做
-SaaS 电商设计 (五) 私有化部署-实现 binlog 中间件适配(附源码)
-SaaS 电商设计 (六) 实现 id 生成器本地化生产 (附源码)
-SaaS 电商设计 (七) 利用 Spring 扩展点 ImportBeanDefinitionRegistrar 实现 toB 系统对接(附源码)

-SaaS 电商设计 (八) 直接就能用的一套电商商品池完整设计方案(建议收藏)

一.背景

购物车是电商交易流程中的关键模块,承上启下,作为导购环节的最后一环,为用户在多个场景下进行购物决策提供便利。除了支持用户对自己的购物车进行常规的增删改查操作外,购物车还提供了丰富的功能,如凑单、换购、手动换促销、自动切换最优促销、自动领券结算、设置常购商品、筛选搜索等,以提高用户的操作效率和决策能力。此外,购物车还具备一系列营销能力,包括砸京蛋、跨店满减、每日一促、无货推荐和营销氛围增强等,以增加用户的购买欲望和促进销售额的增长。

    如上图是某电商购物车的底部一个弹层功能,提供的是当前勾选商品后具体结算金额的明细.如:优惠券优惠明细,plus95折明细.plus会员购物返利等.是一个用户结算的工具.

1.1 业务背景

    话不多说,书归正传.从开头图例来看,在具体研发过程中其实是存在很多种底部弹层的场景.目前是业务场景玩法越来越多的背景下,迭代速度也日渐频繁.对于后端技术同学不得不在这些业务插入诸多的楼层代码去补齐业务场景逻辑.而且通过增加字段的方式每次的变更都需要联合前后端同时的迭代开发,考虑到 app 端开发发版节奏相对低频且成本较大.存在业务诉求和开发迭代周期之间的 gap .能否存在仅后端发布解决迭代更新的可能?而且尽可能少的改动去完成迭代开发?

底部弹层的业务场景迭代频率较高

1.2 技术负债

    在这些频繁的业务场景迭代过程中,研发侧不得不更紧凑的迭代周期去完成指定的迭代任务.导致不得不在历史诸多代码中龙飞凤舞,后来者更是不敢错过一行,小心翼翼找寻代码,更新改动.长此以往愈演愈烈,这批代码就成为不可被替代开发者之代码.不用说开闭原则,优雅维护起来也变得遥不可及.如下是其中一个小类,关注与左下角. 5k+ 行.

    每每服务端更新相应逻辑, app 移动端不得不跟随改动,发布集成,更新版本.周期较长.

长期的版本更新,代码维护性较差
不可扩展的更新,导致移动端跟随发布

二.技术目标

  • 在高频的业务迭代节奏中尽可能去低改动去完成业务目标
  • 技术实现尽可能可扩展,利于维护(满足开闭原则)
  • 鉴于移动端发版周期长.尽可能移动端不改动,不迭代.即减少联调成本也利于快速排查问题.

三.方案设计

3.1 解决移动端频繁发版

3.1.1 场景分析

鉴于以上的一个公共特征,如上分析我们看起来可以抽象一个类 floor 去完成每一行的渲染,每一行的副标题也是同样可以继续复用.以此来解决每次新增场景,同步新增字段来处理的逻辑.这样的话除了共减场景的渲染其他看起来是一致的.所有的渲染移动端可以通过遍历 floor 的数组去完成整个弹层的渲染.这样一来的话,移动端的工作就变得非常简单,仅仅开发一次看起来就解决了问题.这样就解决了我们的第三个技术目标.完成移动端免除跟随发版的困扰.具体如下:

3.1.2 技术方案

其中 sort 字段是为了支持产品的一些排序诉求.这里就比较简单了.通过实现 Comparable 接口即可.具体渲染后是这样

{"floorDetails": [{"floorItemCode": "spze","floorItemName": "商品总额","floorItemPrice": "¥20.90","styleExt": ["bold"]},{"floorItemCode": "lj","floorItemName": "立减","floorItemPrice": "-¥5.00"},{"floorItemCode": "coupon","floorItemName": "优惠券","floorItemPrice": "-¥6.00","floorItemSubName": "已领券 -¥6.00"},{"floorItemCode": "plus95","floorItemName": "PLUS专享95折","floorItemPrice": "-¥1.04","floorItemSubName": "本月剩余优惠额度 ¥1,000.00"}]
}

如上的数据结构 app 端就可以通过数组遍历的形式来获取指定楼层渲染的逻辑.在后端动态增加item时,也尽可能的做到少改动,甚至不改动即可做到支持.解决我们第一个技术目标:在高频的业务迭代节奏中尽可能去低改动去完成业务目标

3.2 减少后端坏味道代码&无法灵活扩展问题

3.2.1 通过抽象接口完成各自单独楼层渲染逻辑

如上我们抽象一个 FloorBuilder 类接口,通过具体的 FloorItemCode 来进行寻找指定的类进行渲染.这样一来每个 code 对应的渲染和获取逻辑都能够在各自的类中,避免都在同一个类中书写大量逻辑.对于修改和新增来说,后来的同学去追寻历史逻辑的成本相对较低.

3.2.2 通过配置能力做到部分字段可配

如上通过结合配置中间件的能力,做到部分字段可配置,下发配置后可以通过遍历所有的配置.通过配置code来获取指定的策略类来完成指定楼层渲染.解决我们第二个技术目标:技术实现尽可能可扩展,利于维护(满足开闭原则)

四.升级上线(普适于高并发大流量的业务场景的功能上线更新)

如上是大概的技术方案,整体的迭代过程中仅仅是完成了功能的改造.能感受到整体的改动还是非常大的.尤其是作为技术侧的一个优化.再加上本身是一个黄金流程中非常重要的一环.本身来说稳定性是第一位的.所以这里关于升级发布的流程也做一个大致的介绍.要知道,如此高并发的场景出了一个问题,不用问就是要被拖入**“广进”**的,小伙子你也不想的吧.

上线第一要义:稳定稳定还是稳定.稳定压倒一切.到底怎么做.

  • 1.第一要支持灰度
  • 2.最好要有支持版本控制
  • 3.最次最低要支持开关降级,实在不行下线相应功能完成动态完成问题功能下线

总结起来就是首先要小流量试跑,出问题要有后路.给程序留后路也是给目前经济不景气的自己留后路哈.兄弟们.话不多说,一图胜千言.上图.

在这里插入图片描述

总体上一个非常普适的高流量高并发通用的线上发布功能流程.略去了一些细节,大体上的思路还是能看的到.具体介绍下.

  • step1:第一个是开发功能(含分支管理的流程)

稍微扩展下.大厂的场景基本上如此.
稍有不同的是,猫厂是各个feature branch 合并动作是自动通过aone来控制的,并且合并master的动作是整体的上线流程完成之后自动通过aone完成.
狗厂的流程目前各个feature branch 手动合并到本次一个vxx branch ,最后通过合并到master来进行线上部署.

ps:猫厂整体流程化还是相对来说要更加自动化一些.

  • step2:完成预发环境的验证

这里有两个点.
– 合并后的 vxx branch 功能合集验证,比如说本次的技术楼层优化.
– 本次功能代码链接线上配置,数据库,服务等预线上环境验证.

这里如果还涉及到一些接口的改造,其实还需要有压力验证,这里就没有体现

  • step3:上线流程前的一个review
    对于本次的话,技术优化可能相对来说比较大一个改造.通常尽量是做到组内的一次上线前的review,确定切量范围,确定版本控制,确定回滚方案,确定降级方案

-step4:上线过程中的流量切换

流量切换前一定要保证流量切掉后,剩余的机房能够支持现有日常流量这个就要大家各自参考各自系统目前的水位情况以及日常qps了.

  1. 流量切换到001机房,完成002,003机房部署以及部署后的单机验证.np挂载.挂载后的vip验证.

  2. 流量切换到002机房,003机房.摘除001机房流量.这样保持尽量长的时间(12h),利用线上的用户流量做一次灰度流量验证.(一般的功能验证),其实如果是较大的功能且功能较大,可以在整体之前加一个内部pin验证.对应倒数第二组的图内容.

  3. 步骤2的过程中没有任何问题,此时001机房已经摘量,可以继续完成镜像部署.还是同样的流程,完成单机验证,多集群部署,np挂载,vip验证.也就是最后一组图中的内容.

赠人玫瑰 手有余香 我是柏修 一名持续更新的晚熟程序员
期待您的点赞,关注加收藏,加个关注不迷路,感谢
您的鼓励是我更新的最大动力
↓↓↓↓↓↓

相关文章:

SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)

目录 一.背景1.1 业务背景1.2 技术负债 二.技术目标三.方案设计3.1 解决移动端频繁发版3.1.1 场景分析3.1.2 技术方案 3.2 减少后端坏味道代码&无法灵活扩展问题3.2.1 通过抽象接口完成各自单独楼层渲染逻辑3.2.2 通过配置能力做到部分字段可配 四.升级上线(普适于高并发大…...

数据结构——lesson5栈和队列详解

hellohello~这里是土土数据结构学习笔记🥳🥳 💥个人主页:大耳朵土土垚的博客 💥 所属专栏:数据结构学习笔记 💥对于顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感谢大家的观看与…...

使用rsync同步服务器和客户端的文件夹

使用rsync同步服务器和客户端的文件夹 实现目的实验准备实验操作步骤服务器操作关闭防火墙和SELINUX安装rsync修改服务器配置文件/etc/rsync.conf创建服务器备份文件的目录创建rsync系统运行的用户修改备份文件的所有者和所属组创建rsync.passwd启动rsync服务并进行验证 客户端…...

计算机网络|Socket

文章目录 Socket并发socket Socket Socket是一种工作在TCP/IP协议栈上的API。 端口用于区分不同应用,IP地址用于区分不同主机。 以下是某一个服务器的socket代码。 其中with是python中的一个语法糖,代表当代码块离开with时,自动对s进行销毁…...

Python 使用 MyHDL库 实现FPGA板卡仿真验证

要使用 Python 结合 MyHDL 库实现 FPGA 板卡的仿真验证,您可以利用 MyHDL 提供的硬件描述语言和仿真功能来进行 FPGA 设计的验证。下面我将为您介绍一个简单的示例,演示如何使用 MyHDL 库进行 FPGA 设计的仿真验证。 步骤概述 编写 MyHDL 硬件描述&…...

解决SpringBoot集成WebSocket打包失败问题

前言 这几天在一个SpringBoot项目中使用WebSocket来用作客服聊天以及上传文件功能,项目在写的时候,以及在idea中跑的时候都非常完美,结果一打成jar包是,报错.在网上查了报错原因,原来是自己导入的WebSocket的jar与SpringBoot内置tomcat中的WebSocket的jar冲突,需要在打包时把S…...

i-vista五星测试标准

智能行车板块以八类场景评测汽车的 单车道纵向控制能力、 单车道横向控制能力、 单车道纵横向组合控制能力及换道辅助能力, 8类场景包括目标车静止、目标车低速、目标车减速、前车切入(新增场景)、直道居中行驶、直道驶入弯道、盲区无车、盲…...

初识Maven

介绍: web后端开发技术ApacheMaven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。安装:http://maven.apache.org/ Apache软件基金会,成立于19…...

16 Educational Codeforces Round 142 (Rated for Div. 2)C. Min Max Sort(递归、思维、dp)

C. Min Max Sort 很不错的一道题目,不过脑电波和出题人每对上, q w q 。 qwq。 qwq。 正难则反。 我们考虑最后一步是怎么操作的。 最后一步一定是对 1 1 1和 n n n进行操作 那么上一步呢? 上一步应该是对 2 2 2和 n − 1 n-1 n−1 以此类推…...

Mongodb安装配置

Mongodb安装配置 一、MongoDB简介二、Windows下MongoDB安装2.1.MongoDB下载2.2.安装MongoDB【解压版】2.2.1.解压2.2.2.创建和 bin 目录同级 data\db 目录来存储 MongoDB 产生的数据2.2.3.进入 bin 目录,cmd命令行窗口,使用命令的指定存储数据文件的形式…...

Linux常用操作命令大全

Linux常用操作命令大全 Linux,作为一款开源的操作系统,深受全世界开发者和系统管理员的喜爱。在Linux环境下,用户通过命令行界面可以执行各种操作,从而实现对系统的全面控制。本文将详细介绍Linux中常用的操作命令,帮助读者更好地理解和运用这些命令。 一、文件操作命令…...

CVPR2023 | 提升图像去噪网络的泛化性,港科大上海AILab提出 MaskedDenoising,已开源!

作者 | 顾津锦 首发 | AIWalker 链接 | https://mp.weixin.qq.com/s/o4D4mNM3jL6sYuhUC6VgoQ 当前深度去噪网络存在泛化能力差的情况,例如,当训练集噪声类型和测试集噪声类型不一致时,模型的性能会大打折扣。作者认为其原因在于网络倾向于过度…...

[python] dict类型变量写在文件中

在Python中,如果你想要将一个字典变量以具有可读性的格式写入文件,并且指定缩进为2个空格,你可以使用json模块来实现。json模块提供了一种很方便的方法来进行序列化和反序列化Python对象。下面是一个具体的示例: 字典变量以具有可…...

设计循环队列

文章目录 一、循环队列的构建二、判断是否为空三、判断队列是否满了四、队列插入五、队列的删除六、队列取头尾 设计循环队列 下面是队列提供的接口函数 typedef struct {int* a;int k;int front;int rear; } MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {…...

linux文件解压和压缩命令

linux文件解压和压缩命令 1.格式.zip 解压:unzip filename.zip 压缩:zip filename.zip directoryName 2.格式.rar 解压: #解压方式1(会在当前解压目录内产生一个以压缩包名字命名的目录,目录内是解压内容) …...

飞链云:让AI创造价值,让人类享受收益

我梦想有天,每个有能力的人都可以做自己喜欢的事情,都应该去做自己喜欢的事情,并且可以获得应有的收益。 有的人可以称之为“人”,有的人你得称他为鬼,有的人不如畜生。 如今社会,每个人都为了“生活”日…...

[NSSCTF 2nd]MyJs

做一题ejs原型链污染 首先是登录界面 源码里面提示了源码的路由 js不熟先审计一下 const express require(express); #导入Express框架,用于构建Web应用程序的服务器和路由 const bodyParser require(body-parser); #导入body-parser中间件,用于解析…...

NLP-词向量、Word2vec

Word2vec Skip-gram算法的核心部分 我们做什么来计算一个词在中心词的上下文中出现的概率? 似然函数 词已知,它的上下文单词的概率 相乘。 然后所有中心词的这个相乘数 再全部相乘,希望得到最大。 目标函数(代价函数&#xff0…...

Java学习--学生管理系统(残破版)

代码 Main.java import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {ArrayList<Student> list new ArrayList<>();loop:while (true) {System.out.println("-----欢迎来到阿宝院校学生管理系…...

柯西矩阵介绍

经典定义 柯西矩阵&#xff08;Cauchy Matrix&#xff09;&#xff0c;是一种特殊类型的矩阵&#xff0c;它在数学中的多个领域&#xff0c;包括线性代数、数值分析和插值理论中都有重要应用。柯西矩阵以19世纪法国数学家奥古斯丁-路易柯西的名字命名。 柯西矩阵是一个方阵&am…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...