最新要闻
- 新一代“夜视神器”!佳能推出全球首款SPAD传感器相机
- 世界最资讯丨地球上将近一半人都在玩游戏!全球游戏受众已达37亿
- 全球实时:6年前的麒麟970如获新生 24款设备升级华为鸿蒙3系统
- 铝车身强度差?奇瑞小蚂蚁表示不服:托举30吨坦克
- 微速讯:徕卡CEO体验小米13 Ultra后打出满分:影像素质前所未有
- 全球消息!湖北构建全国劳动争议多元化解先行区
- 韩国面板巨头要卖掉中国LCD工厂?TCL否认接盘:消息不实
- 女子拒绝调岗降薪被辞退:离职证明上写着“简历造假” 当事人难就业
- 世界速递!一加Ace 2新增18GB内存 被指反向升级 高管解释:真没有
- 【世界新视野】国内5月上映 迪士尼《小美人鱼》新剧照公布:脏辫黑人鱼与王子对视
- 天天速看:首发1350元 铭凡UM560XT迷你主机上架:锐龙5 5600H、液金散热
- 【聚看点】非法捕捞水产品案进行生态补偿 三亚海警局组织增殖放流3000尾鱼苗
- 24层楼高!我国首艘大型邮轮将交付:2500万个零件
- 【天天聚看点】文案没能逃过因AI失业!蓝色光标回应AI取代文案外包:属实
- 全球最资讯丨车主曝极氪001自动加速撞车:官方承认失控、但不担责任
- 《生化危机:死亡岛》角色介绍:克莱尔、瑞贝卡、吉尔太美了
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
每日看点!vivo全球商城:电商交易平台设计
小结:
1、租户
vivo全球商城:电商交易平台设计 https://mp.weixin.qq.com/s/YDPZi1D8EDtv-C72_LRsog
(资料图片仅供参考)
作者:vivo 官网商城开发团队 - Cheng Kun、Liu Wei
本文介绍了交易平台的设计理念和关键技术方案,以及实践过程中的思考与挑战。
点击查阅:《vivo 全球商城》系列文章
一、背景
vivo官方商城经过了七年的迭代,从单体架构逐步演进到微服务架构,我们的开发团队沉淀了许多宝贵的技术与经验,对电商领域业务也有相当深刻的理解。
去年初,团队承接了O2O商城的建设任务,还有即将成立的礼品中台,以及官方商城的线上购买线下门店送货需求,都需要搭建底层的商品、交易和库存能力。
为节约研发与运维成本,避免重复造轮子,我们决定采用平台化的思想来搭建底层系统,以通用能力灵活支撑上层业务的个性化需求。
包括交易平台、商品平台、库存平台、营销平台在内的一整套电商平台化系统应运而生。
本文将介绍交易平台的架构设计理念与实践,以及上线后持续迭代过程中的挑战与思考。
二、整体架构
2.1 架构目标
除了高并发、高性能、高可用这三高外,还希望做到:
低成本
注重模型与服务的可重用性,灵活支撑各业务的个性化需求,提高开发效率,降低人力成本。
高扩展
系统架构简单清晰,应用系统间耦合低,容易水平扩展,业务功能增改方便快捷。
2.2 系统架构
(1)电商平台整体架构中的交易平台
(2)交易平台系统架构
2.3 数据模型
三、关键方案设计
3.1 多租户设计
(1)背景和目标
交易平台面向多个租户(业务方),需要能够存储大量订单数据,并提供高可用高性能的服务。
不同租户的数据量和并发量可能有很大区别,要能根据实际情况灵活分配存储资源。
(2)设计方案
考虑到交易系统OLTP特性和开发人员熟练程度,采用MySQL作为底层存储、ShardingSphere作为分库分表中间件,将用户标识(userId)作为分片键,保证同一个用户的订单落在同一个库中。
接入新租户时约定一个租户编码(tenantCode),所有接口都要带上这个参数;租户对数据量和并发量进行评估,分配至少满足未来五年需求的库表数量。
租户与库表的映射关系:租户编码 -> {库数量,表数量,起始库编号,起始表编号}。
通过上面的映射关系,可以为每个租户灵活分配存储资源,数据量很小的租户还能复用已有的库表。
示例一:
新租户接入前已有4库*16表,新租户的订单量少且并发低,直接复用已有的0号库0号表,映射关系是:租户编码-> 1,1,0,0
示例二:
新租户接入前已有4库*16表,新租户的订单量多但并发低,用原有的0号库中新建8张表来存储,映射关系是:租户编码-> 1,8,0,16
示例三:
新租户接入前已有4库*16表,新租户的订单量多且并发高,用新的4库*8表来存储,映射关系是:租户编码-> 4,8,4,0
用户订单所属库表计算公式
库序号 = Hash(userId) / 表数量 % 库数量 + 起始库编号表序号 = Hash(userId) % 表数量 + 起始表编号
可能有小伙伴会问:为什么计算库序号时要先除以表数量?下面的公式会有什么问题?
库序号 = Hash(userId) % 库数量 + 起始库编号表序号 = Hash(userId) % 表数量 + 起始表编号
答案是,当库数量和表数量存在公因数时,会存在倾斜问题,先除以表数量就能剔除公因数。
以2库4表为例,对4取模等于1的数,对2取模也一定等于1,因此0号库的1号表中不会有任何数据,同理,0号库的3号表、1号库的0号表、1号库的2号表中都不会有数据。
路由过程如下图所示:
(3)局限性和应对办法
全局唯一ID
问题:分库分表后,数据库自增主键不再全局唯一,不能作为订单号来使用。且很多内部系统间的交互接口只有订单号,没有用户标识这个分片键。
方案:如下图所示,参考雪花算法来生成全局唯一订单号,同时将库表编号隐含在其中(两个5bit分别存储库表编号),这样就能在没有用户标识的场景下,从订单号中获取库表编号。
全库全表搜索
问题:管理后台需要根据各种筛选条件,分页查询所有满足条件的订单。
方案:将订单数据冗余存储一份到搜索引擎Elasticsearch中,满足各种场景下的快速灵活查询需求。
3.2 状态机设计
(1)背景
之前做官方商城时,由于是定制化业务开发,各类型的订单和售后单的状态流转都是写死的,比如常规订单在下单后是待付款,付款后是待发货,发货后是待收货;虚拟商品订单不需要发货,没有待发货状态。
现在要做的是平台系统,不可能再为每个业务方做定制化开发,否则会导致频繁改动发版,代码错综冗余。
(2)目标
引入订单状态机,能为每个业务方配置多套差异化的订单流程,类似于流程编排。
新增订单流程时,尽可能不改动代码,实现状态和操作的可复用性。
(3)方案
在管理后台为每个租户维护一系列订单类型,数据转化为JSON格式存储在配置中心,或存储在数据库并同步到本地缓存中。
每个订单类型的配置包括:初始订单状态,以及每个状态下允许的操作和操作之后的目标状态。
当订单在执行某个动作时,使用订单状态机来修改订单状态。
订单状态机的公式是:
StateMachine(E,S —> A,S’)
表示订单在事件E的触发下执行动作A,并从原状态S转化为目标状态S’
每个订单类型配置完成后,生成数据的结构是
/**
* 订单流程配置
**/
@Data
public class OrderFlowConfig implements Serializable {
/**
* 初始订单状态编码
**/
private String initStatus;
/**
* 每个订单状态下,可执行的操作及执行操作后的目标状态
* Map<原状态编码, Map<订单操作类型编码, 目标状态编码>>
*/
private Map
> operations; }
订单商品行状态机、售后单状态机,也用同样的方式实现
3.3 通用操作触发器
(1)背景
业务中通常都会有这样的延时需求,我们之前往往通过定时任务来扫描处理。
下单后多久未支付,自动关闭订单
申请退款后商家多久未审核,自动同意申请
订单签收后多久未确认收货,自动确认收货
(2)目标
业务方有类似的延时需求时,能够有通用的方式轻松实现
(3)方案
设计通用操作触发器,具体步骤为:
配置触发器,粒度是状态机的流程类型。
创建订单/售后单时或订单状态变化时,如果有满足条件的触发器,发送延迟消息。
收到延迟消息后,再次判断执行条件,执行配置的操作。
触发器的配置包括:
注册时间:可选订单创建时,或订单状态变化时
执行时间:可使用JsonPath表达式选取订单模型中的时间,并可叠加延迟时间
注册条件:使用QLExpress配置,满足条件才注册
执行条件:使用QLExpress配置,满足条件才执行操作
执行的操作和参数
3.4 分布式事务
对交易平台而言,分布式事务是一个经典问题,比如:
创建订单时,需要同时扣减库存、占用优惠券,取消订单时则需要进行回退。
用户支付成功后,需要通知发货系统给用户发货。
用户确认收货后,需要通知积分系统给用户发放购物奖励的积分。
我们是如何保证微服务架构下数据一致性的呢?首先要区分业务场景对一致性的要求。
(1)强一致性场景
比如订单创建和取消时对库存和优惠券系统的调用,如果不能保证强一致,可能导致库存超卖或优惠券重复使用。
对于强一致性场景,我们采用Seata的AT模式来处理,下面的示意图取自seata官方文档。
(2)最终一致性场景
比如支付成功后通知发货系统发货,确认收货后通知积分系统发放积分,只要保证能够通知成功即可,不需要同时成功同时失败。
对于最终一致性场景,我们采用的是本地消息表方案:在本地事务中将要执行的异步操作记录在消息表中,如果执行失败,可以通过定时任务来补偿。
3.5 高可用与安全设计
熔断
使用Hystrix组件,对依赖的外部系统添加熔断保护,防止某个系统故障的影响扩大到整个分布式系统中。
限流
通过性能测试找出并解决性能瓶颈,掌握系统的吞吐量数据,为限流和熔断的配置提供参考。
并发锁
任何订单更新操作之前,会通过数据库行级锁加以限制,防止出现并发更新。
幂等性
所有接口均具备幂等性,上游调用我们接口如果出现超时之类的异常,可以放心重试。
网络隔离
只有极少数第三方接口可通过外网访问,且都有白名单、数据加密、签名验证等保护,内部系统交互使用内网域名和RPC接口。
监控和告警
通过配置日志平台的错误日志报警、调用链的服务分析告警,再加上公司各中间件和基础组件的监控告警功能,让我们能够能够第一时间发现系统异常。
3.6 其他考虑
是否用领域驱动设计
考虑到团队非敏捷型组织架构,又缺少领域专家,因此没有采用
高峰期性能瓶颈问题
大促和推广期间,特别是爆款抢购时的流量可能会触发限流,导致部分用户被拒之门外。因为无法准确预估流量,难以提前扩容。
可以通过主动降级方案增加并发量,比如同步入库切为异步入库、db查询转为cache查询、只能查到最近半年的订单等。
考虑到业务复杂度和数据量级还处在初期,团队规模也难以支撑,这些设计有远期计划,但暂时还没做。(架构的合适性原则,杀鸡用牛刀,你愿意也行)。
四、总结与展望
我们在设计系统时并没有一味追求前沿技术和思想,面对问题时也不是直接采用业界主流的解决方案,而是根据团队和系统的实际状况来选取最合适的办法。好的系统不是在一开始就被大牛设计出来的,而是随着业务的发展和演进逐渐被迭代出来的。
目前交易平台已上线一年多,接入了三个业务方,系统运行平稳,公司内有交易/商品/库存等需求的新业务,以及存量业务在遇到系统瓶颈需要升级时,都可以复用这块能力。
上游业务方数量的增加和版本的迭代,对平台系统的需求源源不断,平台的功能得到逐渐完善,架构也在不断演进,我们正在将履约模块从交易平台中剥离出来,进一步解耦,为业务持续发展做好储备。
翻译
搜索
复制
关键词:
-
每日看点!vivo全球商城:电商交易平台设计
小结:1、租户vivo全球商城:电商交易平台设计https: mp weixin qq com s YDPZi1D8EDtv-C72_LRs...
来源: 每日看点!vivo全球商城:电商交易平台设计
焦点速看:python中如何修改文件?
全球快看:js数组方法之数组变异方法
新一代“夜视神器”!佳能推出全球首款SPAD传感器相机
世界最资讯丨地球上将近一半人都在玩游戏!全球游戏受众已达37亿
全球实时:6年前的麒麟970如获新生 24款设备升级华为鸿蒙3系统
铝车身强度差?奇瑞小蚂蚁表示不服:托举30吨坦克
微速讯:徕卡CEO体验小米13 Ultra后打出满分:影像素质前所未有
全球消息!湖北构建全国劳动争议多元化解先行区
每日视讯:JdkProxy的进阶知识
全球快看点丨【Visual Leak Detector】Release 模式下使用 VLD
【环球聚看点】债市日报:4月12日
韩国面板巨头要卖掉中国LCD工厂?TCL否认接盘:消息不实
女子拒绝调岗降薪被辞退:离职证明上写着“简历造假” 当事人难就业
世界速递!一加Ace 2新增18GB内存 被指反向升级 高管解释:真没有
【世界新视野】国内5月上映 迪士尼《小美人鱼》新剧照公布:脏辫黑人鱼与王子对视
天天速看:首发1350元 铭凡UM560XT迷你主机上架:锐龙5 5600H、液金散热
【聚看点】非法捕捞水产品案进行生态补偿 三亚海警局组织增殖放流3000尾鱼苗
全球即时:最全的python正则使用
环球精选![翻译]ExecutionContext vs SynchronizationContext
24层楼高!我国首艘大型邮轮将交付:2500万个零件
【天天聚看点】文案没能逃过因AI失业!蓝色光标回应AI取代文案外包:属实
全球最资讯丨车主曝极氪001自动加速撞车:官方承认失控、但不担责任
《生化危机:死亡岛》角色介绍:克莱尔、瑞贝卡、吉尔太美了
播报:腾讯QQ邮箱关联邮箱帐号功能要没了!5月15日终止服务
王一鸣:重点激活服务消费,放松中高端商品和服务消费的限制性措施
天天最新:新人必看| 移动端“动态化”是什么意思?
guacamole免密登录,guacamole不通过登录界面登录,guacamole指定用户名免密登录
天天快看点丨图数据库驱动的基础设施运维实操
java 如何计算两个汉字的相似度?如何获得一个汉字的相似汉字?
全球讯息:PostgreSQL 备忘清单_开发速查表分享
当前热文:《CS:GO》价值百万库存玩家被封:只因给其他玩家留言
环球速读:华为智慧屏S3 Pro官宣:顶部配“AI慧眼”、超窄四边
比亚迪微型电动车海鸥内饰发布:看齐海豚、卖8万买不
环球快讯:豆瓣评分跌至6.4!成龙《龙马精神》票房艰难破亿
每日速讯:“小Mate 50 Pro”实锤!华为畅享60X正面揭晓:旗舰同款刘海屏
环球今头条!4月15日 厦门邮轮母港公交场站正式启用(附公交调整方案)
环球消息!2023 年十大 API 管理趋势
新资讯:如何打开 plist 文件
每日短讯:Three.js教程:第一个3D场景
【天天时快讯】pymysql操作数据库入门
快看点丨高数上复习
辽宁发行150亿元专项债补充盛京银行资本金
【环球聚看点】《信托大家谈——信托业转型发展对大众意味着什么》
观点数字化大会 | 德信集团胡一平:一定要积极拥抱数字化改革
世界关注:非会员看剧遇3000多秒广告 优酷回应:确实会有 属极个别情况
世界今日讯!小米长焦之王!13 Ultra塞进两颗长焦镜头
专家称北京打车太便宜应涨价 崔东树曾任汽车销售
环球快看:女子疯狂网上购物确诊帕金森:过度伤害性冲动行为
世界最资讯丨自研大模型图片生成被质疑 商汤回应:秒画也有第三方开源模型
关于数智融合,看看这20位专家都聊了什么
热文:在.NET Core使用 HttpClient 的正确方式
看!前端新人如何用ChatGPT开发APP
JMeter-BeanShell预处理程序和BeanShell后置处理程序的应用
当前速读:智能指针基本原理,简单实现,常见问题
今日热门!叶一茜当众骂森碟“心机”,她就这么恨女儿?
【新华500】新华500指数(989001)12日窄幅震荡跌0.10%
沙尘跨过长江一路向南!直击江皖沪多地沙尘现场
要闻:GT Neo5 SE 1TB版只卖2599 真我喊话:现货才是硬道理
RTX 4070今晚发布 结果遭AMD背刺了:显存越大越好、4K至少16GB
全球头条:史上最挤”五一档来了!王一博《长空之王》等17部影片扎堆上映
网传明年中旬上海绿牌蓝牌要合并?官方回应来了
当前速读:梯田为“布” 光影为“沙” 点亮乡村“夜经济”
世界热消息:C#使用Elasticsearch入门
plist文件格式转换器
观速讯丨T-SQL基础教程Day1
天天微头条丨云图说|云数据库GaussDB如何做到卓越性能
环球最资讯丨不怕有味儿 比毛巾划算:云南白药洗脸巾0.06元/张狂促
天天热点评!“回锅沙”要来了!部分地方要注意
全球短讯!果粉最期待的大屏MacBook Air来了!苹果史上第一款
世界视点!首款骁龙8+平板中兴Axon Pad来了:12.1寸超大屏
新动态:4月14日State of Play:将展示超20分钟《最终幻想16》
全球看热讯:电商平台商品详情接口的应用场景
热点!二级指针创建二叉树节点与一级指针创建二叉树节点
身体很诚实!马斯克加入AIGC大战:抢购1万张GPU、挖Deepmind墙角
当前视讯!曾被誉为最靠谱!又一家造车新势力发不出工资了
全球微速讯:火山引擎 DataLeap 推出全链路智能监控报警平台
有病了还能买哪种保险?隐瞒健康告知带病投保会怎么样?
理想汽车全系车型电器真实功率再公开:空调果然是耗电大户!
小米13 Ultra样张首亮相:虚化堪比单反 夜拍效果惊人
《龙之家族》新季开拍
罕见超级激励!东方甄选奖励154员工8.83亿港元
【世界独家】00后网红骑摩托车遇车祸身亡 劝不住:网友感慨年轻 有必要全面禁摩?
易基因:METTL3介导的m6A甲基化谱调控肌肉干细胞成肌细胞状态转换|发育分化
全球快资讯丨中骏集团称已备好即将到期美元债兑付资金 拟发行第二支中债增全额担保中票
3月物价数据透露哪些经济变化?促消费政策获得较大空间
天天报道:iPhone 15 Pro颠覆式设计取消了!郭明錤:苹果因技术问题放弃固态按键
丫丫将通过温控卡车运至机场:即将飞赴上海
又有新品牌了!长安启源A07亮相:颜值超高碾压一众国产
报道:推特突然“死亡”!马斯克正式启动打造美版微信
走过别错过!红蜻蜓126款休闲鞋/运动鞋/皮鞋清仓:79元绝世好价
h3c路由器如何恢复出厂设置?h3c路由器配置命令大全
小米手机卡顿反应慢是什么原因?小米手机卡顿反应慢怎么解决?
ssd极速固态硬盘怎么样?ssd极速固态硬盘排名前十
iphone4的显示屏分辨率是多少?iphone4版本太低怎么下载软件?
AMD速龙QL64CPU性能怎么样?amd速龙系列cpu天梯图
Zabbix“专家坐诊”第187期问答汇总
每日报道:数据开发提效有秘诀!离线开发BatchWorks 六大典型场景拆解
全球观天下!公司入职一个阿里大佬,把 Spring Boot 系统启动时间从 7 分钟降到了 40 秒!
HTML中的pre-load 和 pre-fetch