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

news2024/11/16 21:25:17

目录

  • 一.背景
    • 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验证.也就是最后一组图中的内容.

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

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

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

相关文章

NoSQL--2.MongoDB配置

目录 2.MongdoDB配置 2.1 Windows环境下操作 2.1.1 注册MongDB Atlas: 2.1.2 MongoDB Community Server Download: 2.1.3 启动MondgoDB服务: 2.1.3.1 命令行参数的方式启动MongoDB服务: 2.1.3.2 使用配置文件方式启动Mongo…

Python算法100例-3.4 完数

完整源代码项目地址,关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展 1.问题描述 求某一范围内完数的个数。 如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”&…

C#中多语言编程原理及实例解析

文章目录 一、了解C#多语言编程原理1. 通用语言运行库(CLR)2. 通用类型系统(CTS)3. 微软中间语言(MSIL)4. 元数据和反射5. 公共语言规范(CLS) 二、实例说明 一、了解C#多语言编程原理…

Linux笔记--用户与用户组

Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员(root)申请一个账号,然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系…

MIT-BEVFusion系列九--CUDA-BEVFusion部署6 前向推理的数据加载与图像预处理

目录 加载图像数据加载点云数据模型推理并计时预热操作模型推理检查点云输入数据量打印信息中CopyLidar部分的计算和耗时打印信息中ImageNrom图像预处理部分计算和耗时 该系列文章与qwe、Dorothea一同创作,喜欢的话不妨点个赞。 接上面的文章,目光聚焦回…

为啥要用C艹不用C?

在很多时候,有人会有这样的疑问 ——为什么要用C?C相对于C优势是什么? 最近两年一直在做Linux应用,能明显的感受到C带来到帮助以及快感 之前,我在文章里面提到环形队列 C语言,环形队列 环形队列到底是怎么回…

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

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

ElasticSearch相关知识点

ElasticSearch相关知识点 1.了解ES ES的作用:ES是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 ELK技术栈:ES结合kibana、Logstash、Beasts,也就是 elastic stack 。…

NoSQL--1.虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先,导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作: 1.1.2.1 点击开启虚拟机: 1.1.2.2 默认选择回车CentOS Linux(3.10.0-1127.e17.x86_64) 7 …

小白必看的Python函数讲解

定义函数 我们通过斐波那契数列来理解定义函数 >>> def fib(n): # 将斐波那契数列打印到 n ... """将斐波那契数列打印到 n""" ... a, b 0, 1 ... while a < n: ... print(a, end ) ... a, b b, …

IPC资源在linux内核中如何管理

1.先看各个通信的接口 1.共享内存接口 2.消息队列接口 3.信号量接口 2.管理他们的结构体&#xff1a; 其实管理他们的是一个数组&#xff0c;和open返回的fd差不多&#xff0c;shmid&#xff0c;msqid,semid的大小都是这个数组的下标。那数组的结构是什么呢&#xff1f; 然后…

hive中spark SQL做算子引擎,PG作为MetaDatabase

简介 hive架构原理 1.客户端可以采用jdbc的方式访问hive 2.客户端将编写好的HQL语句提交&#xff0c;经过SQL解析器&#xff0c;编译器&#xff0c;优化器&#xff0c;执行器执行任务。hive的存算都依赖于hadoop框架&#xff0c;所依赖的真实数据存放在hdfs中&#xff0c;解析…

JCL中IEFBR14和COND

JCL中IEFBR14和COND ​ COND CODE&#xff0c;就是反映JCL中STEP运行状态的参数&#xff0c;JCL正常终了的COND CODE 是0000&#xff0c;另外笔者在执行某些工具JCL时候&#xff0c;比方说简单一个COMPARE吧&#xff0c;可能会出现0012、0004或者0016&#xff0c;0001&#xf…

【IO流系列】字符流练习(拷贝、文件加密、修改文件数据)

字符流练习 练习1&#xff1a;文件夹拷贝1.1 需求1.2 代码实现1.3 输出结果 练习2&#xff1a;文件加密与解密2.1 需求2.2 代码实现2.3 输出结果 练习3&#xff1a;修改文件数据&#xff08;常规方法&#xff09;3.1 需求3.2 代码实现3.3 输出结果 练习4&#xff1a;修改文件数…

Sqli-labs靶场第19关详解[Sqli-labs-less-19]自动化注入-SQLmap工具注入

Sqli-labs-Less-19 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 返回了Referer &#xff0c;设想如果在Referer 尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会执行…

javaEE--后端环境变量配置

目录 pre 文件准备 最终运行成功结果 后端运行步骤 1.修改setenv文件 2.运行setenv&#xff0c;设置环境变量 3.查看jdk版本 4.修改mysql文件夹下的my文件 前端运行步骤 1.nodejs环境配置 2.查看node和npm版本 3.下载并运行npm 4.注册登录 pre 文件准备 最终运行…

c++基础学习第一天

c基础学习第一天 文章目录 1、C初识1.1、注释1.2、变量1.3、常量1.4、关键字1.5、标识符命名规则 2、数据类型2.1、整型2.2、sizeof关键字2.3、实型&#xff08;浮点型&#xff09;2.4、字符型2.5、转义字符2.6、字符串型2.7、布尔类型bool2.8、数据的输入 3、运算符3.1、算术运…

黑马点评-短信登录业务

原理 模型如下 nginx nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&#xff0c;也可以作为静态资源服务器&#xff0c;轻松扛下上万并发&#xff0c; 负载均衡到下游tomcat服务器&#xff0c;打散流量。 我们都知道一台4核8G的tomca…

低密度奇偶校验码LDPC(八)——QC-LDPC译码器FPGA设计概要

往期博文 低密度奇偶校验码LDPC&#xff08;一&#xff09;——概述_什么是gallager构造-CSDN博客 低密度奇偶校验码LDPC&#xff08;二&#xff09;——LDPC编码方法-CSDN博客 低密度奇偶校验码LDPC&#xff08;三&#xff09;——QC-LDPC码概述-CSDN博客 低密度奇偶校验码…

循序渐进丨MogDB / openGauss 的三种函数稳定性关键字

一、Oracle 中类似的函数稳定性关键字&#xff08;DETERMINISTIC&#xff09; 在 Oracle 里&#xff0c;function有着一个DETERMINISTIC参数&#xff0c;它表示一个函数在输入不变的情况下输出是否确定&#xff0c;只要输入的参数一样&#xff0c;返回的结果一定是一样的&#…