- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
?
vivo 全球商城
亿级订单中心架构设计与实践
?
?
一、背景
随着用户量级的快速增长,vivo 官方商城 v1.0 的单体架构逐渐暴露出弊端:模块愈发臃肿、开发效率低下、性能出现瓶颈、系统维护困难。
从2017年开始启动的 v2.0 架构升级,基于业务模块进行垂直的系统物理拆分,拆分出来业务线各司其职,提供服务化的能力,共同支撑主站业务。
订单模块是电商系统的交易核心,不断累积的数据即将达到单表存储瓶颈,系统难以支撑新品发布和大促活动期间的流量,服务化改造势在必行。
本文将介绍 vivo 商城 订单系统建设的过程中遇到的问题和解决方案,分享架构设计经验。
二、系统架构
将订单模块从商城拆分出来,独立为订单系统,使用独立的数据库,为商城相关系统提供订单、支付、物流、售后等标准化服务。
系统架构如下图所示:
三、技术挑战
3.1?数据量和高并发问题
首先面对的挑战来自存储系统:
数据量问题
随着历史订单不断累积,MySQL中订单表数据量已达千万级。
我们知道InnoDB存储引擎的存储结构是B+树,查找时间复杂度是O(log n),因此当数据总量n变大时,检索速度必然会变慢, 不论如何加索引或者优化都无法解决,只能想办法减小单表数据量。
数据量大的解决方案有:数据归档、分表
高并发问题
商城业务处于高速发展期,下单量屡创新高,业务复杂度也在提升,应用程序对MySQL的访问量越来越高。
单机MySQL的处理能力是有限的,当压力过大时,所有请求的访问速度都会下降,甚至有可能使数据库宕机。
并发量高的解决方案有:使用缓存、读写分离、分库
下面对这些方案进行简单描述:
数据归档
订单数据具备时间属性,存在热尾效应,大部分情况下检索的都是最近的订单,而订单表里却存储了大量使用频率较低的老数据。
那么就可以将新老数据分开存储,将历史订单移入另一张表中,并对代码中的查询模块做一些相应改动,便能有效解决数据量大的问题。
使用缓存
使用Redis作为MySQL的前置缓存,可以挡住大部分的查询请求,并降低响应时延。
缓存对商品系统这类与用户关系不大的系统效果特别好,但对订单系统而言,每个用户的订单数据都不一样,缓存命中率不算高,效果不是太好。
读写分离
主库负责执行数据更新请求,然后将数据变更实时同步到所有从库,用多个从库来分担查询请求。
但订单数据的更新操作较多,下单高峰时主库的压力依然没有得到解决。且存在主从同步延迟,正常情况下延迟非常小,不超过1ms,但也会导致在某一个时刻的主从数据不一致。
那就需要对所有受影响的业务场景进行兼容处理,可能会做一些妥协,比如下单成功后先跳转到一个下单成功页,用户手动点击查看订单后才能看到这笔订单。
分库
分库又包含垂直分库和水平分库。
① 水平分库:把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。
② 垂直分库:按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用。
分表
分表又包含垂直分表和水平分表。
①?水平分表:在同一个数据库内,把一个表的数据按一定规则拆到多个表中。
②?垂直分表:将一个表按照字段分成多表,每个表存储其中一部分字段。
我们综合考虑了改造成本、效果和对现有业务的影响,决定直接使用最后一招:分库分表
3.2 分库分表技术选型
分库分表的技术选型主要从这几个方向考虑:
客户端sdk开源方案
中间件proxy开源方案
公司中间件团队提供的自研框架
自己动手造轮子
参考之前项目经验,并与公司中间件团队沟通后,采用了开源的 Sharding-JDBC 方案。现已更名为Sharding-Sphere。
Github:
/sharding-sphere/
文档:官方文档比较粗糙,但是网上资料、源码解析、demo比较丰富
社区:活跃
特点:jar包方式提供,属于client端分片,支持xa事务
3.2.1 分库分表策略
结合业务特性,选取用户标识作为分片键,通过计算用户标识的哈希值再取模来得到用户订单数据的库表编号.
假设共有n个库,每个库有m张表,
则库表编号的计算方式为:
- 库序号:Hash(userId) / m % n
- 表序号:Hash(userId) % m
路由过程如下图所示:
3.2.2?分库分表的局限性和应对方案
分库分表解决了数据量和并发问题,但它会极大限制数据库的查询能力,有一些之前很简单的关联查询,在分库分表之后可能就没法实现了,那就需要单独对这些Sharding-JDBC不支持的SQL进行改写。
除此之外,还遇到了这些挑战:
(1)全局唯一ID设计
分库分表后,数据库自增主键不再全局唯一,不能作为订单号来使用,但很多内部系统间的交互接口只有订单号,没有用户标识这个分片键,如何用订单号
您可能关注的文档
- Verilog-HDL-设计与综合-数字集成电路设计方法概述-part1.docx
- Verilog-HDL-设计与综合-数字集成电路设计方法概述-part2.docx
- Verilog-HDL-设计与综合-数字集成电路设计方法概述-part6.docx
- Verilog-HDL-设计与综合-数字集成电路设计方法概述.docx
- Verilog-HDL-设计与综合-数字集成电路设计方法概述4.docx
- Verilog-HDL-设计与综合-数字集成电路设计方法概述7.docx
- Verilog-HDL-设计与综合-数字集成电路设计概述.docx
- verilog数字跑表设计实现与仿真.docx
- VGA接口电路设计.docx
- VLSI-Final-Project:小型卷积核单元设计-项目总结.docx
- 2024云南红河州金平县发展集团限公司招聘5人【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- 2024内蒙古锡林郭勒盟西乌珠穆沁旗林业和草原局招录生态管护员【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- 2024云南省事业单位联考招录【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- 2024下半年湖北孝感市孝南区部分事业单位招聘79人【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- 2024下半年四川绵阳事业单位历年【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- 2024中铁四局总部部门及直属单位员工公开招聘6人【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- 2024中铁建电气化局集团南方工程限公司2024届校园招聘【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- 2024云南中冶建设工程限责任公司招聘10人【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- 2024中钢集团高校毕业生招聘575人【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
- 2024下半年浙江嘉兴南湖区卫生系统招聘事业单位工作人员31人【综合基础知识500题】高频考点模拟试题及参考答案解析.docx
文档评论(0)