基于订单系统的分库分表实战,让应用飞起来!

news/2024/5/6 23:56:04/文章来源:https://blog.csdn.net/qq_42046105/article/details/127231861
V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

前 言

各位读者朋友,大家好,这是分库分表实战的第一篇文章,首先介绍一下"基于ShardingSphere的分库分表实战"的设计思路及内容。

本实战的重点是分库分表实战,比较适合1~3年工作经验的程序员朋友。实战主要以外卖APP中的外卖订单来作为本次实战的核心业务。

基于外卖订单业务,儒猿技术团队开发了一个外卖订单项目,通过该项目逐步分析随着订单数据量逐步增加,系统将遇到什么问题。

并以这些问题为线索逐步分析,在分库分表之前,有没有一些方案可以初步解决这些问题,随着订单数据量的增加,为什么这些方案会失效,最后导致不得不分库分表。

而分库分表方案具体该如何设计?方案设计完成之后又该如何落地?分库分表方案引入之后又会带来什么新的问题?这些问题都可以在本实战中找到答案。


认识一下单库版本的订单系统

开始时,订单系统是用单库跑的,随着数据量的不断增大,系统将会采取各种措施逐步优化,比如索引和sql的优化加缓存上读写分离垂直分库等方案,最后实在抗不住了才会进行分库分表

从单库版本到分库分表版本的整个优化过程的基础是一个单库版本的外卖订单系统。

儒猿技术团队已提前使用Spring+SpringMVC+MyBatis开发实现了外卖订单系统,该单库版本的订单系统,整体架构图如下所示:

图片

上图是单库版本订单系统的逻辑架构图和技术架构图的一个对比。该订单系统共分三层,分别是访问层、服务层和数据层。

1. 访问层:是调用后台服务的入口,这里直接使用postman来调用,因为重点是分库分表的方案落地,偏后端,所以直接使用postman来作为请求入口,非常的方便。

2. 服务层:是整个订单系统的核心,它提供了外卖订单系统的核心功能,比如用户下单、用户查询订单列表、商家接单等核心功能;而为了实现这些功能,使用了一些技术,比如使用Tomcat作为服务器来对外提供服务、使用Spring Web MVC作为web的开发框架、使用Spring IOC来管理bean、使用MyBatis来操作数据库、使用logback来记录日志。

3. 数据层:主要是用来存储外卖订单数据,这里使用的数据库是MySQL。


业务快速增长,驱动系统架构不断演进

这里设定一个背景,该外卖订单系统是位于一家初创型互联网公司的,目前积累的用户差不多10万的样子,每天活跃的用户大概就2万,每天相应的订单量也是2万的样子

图片

简单估算一下,一年的订单数据量也就七八百万的样子,单个数据库还是非常轻松抗住的。

索引和sql优化

但创业型公司的发展是比较迅猛的,如果踩对风口的话,用户会呈现爆发式的增长,这个时候外卖APP的用户量可能会迅速增长到了100万,日活用户20万,日订单20万订单单表也从之前的几百万快速达到了2000万的级别,如下图:

图片

令人担忧的是,随着时间的推移,订单单表的数据会继续快速增长,此时sql查询的性能开始慢慢下降,这时就要着手优化sql了。

此时先从索引和sql着手优化,展示sql优化的一般流程,这里将会有2个case,

  • 隐式转换导致索引失效
  • 一个是关于join连接查询的

引入缓存方案

优化案例 ——高峰期大量请求打到MySQL,导致数据库资源占用率很高,从而降低了MySQL的查询性能,最终导致订单sql查询突增到2s

为了解决这个问题,引入缓存,如下图:

图片

说白了,就是使用缓存来承接大多数的查询请求,这样到达数据库的请求就非常少了,数据库的资源占用率就会稳定在一个正常范围,从而使得订单sql的查询效率,不至于受到很大影响。

引入读写分离方案

优化案例 —— 由于促销活动的原因,大量下单的用户会不断刷新页面来查询订单信息,比如看一下订单是否开始配送,此时就会导致大量的请求打到MySQL上去。

此时单库又抗不了这么读请求,就导致了数据库负载很高,从而严重降低了订单sql的查询效率,最终导致在促销活动期间,订单sql的查询时间突增到2.5s

促销活动期间对订单的操作,是典型的读多写少场景,为了解决这个问题,引入了读写分离的方案,如下图:

图片

也就是写数据请求走主库,而读数据请求走从库,由于搞了2个从库,它们可以一起来抗住大量的读请求,订单sql的查询效率就可以得到显著的提升

引入垂直分库方案

引入读写分离方案后可能又会遇到一个问题,那就是此时商品模块、订单模块、用户模块都部署在同一台物理数据库上,也就是主库上,此时这台物理数据库的CPU、内存和网络的负载能力,都是商品模块、订单模块、用户模块共用的。

如某天,商品模块做了一些活动,此时商品模块就会承接大量的读请求,尴尬的是商品模块并没有做读写分离,此时商品模块所处的这台物理数据库,它的CPU、内存和网络负载的占用都会很高。

关键是,数据库的资源是有限的,商品模块已经占用了大量的数据库资源,而订单模块能用的数据库资源就变得非常有限了,此时**订单写数据的sql执行时间就可能突增到了2s,**对于订单来说肯定是万万不能接受的。

所以,为了避免其他业务模块对订单模块的影响,将进行了垂直分库的改造,如下图:

图片

垂直分库后,每个业务都有自己独立的一台物理服务器,之前资源相互占用的问题也就不存在了,最终完美的解决了订单写数据时间突增的问题。

因为随着时间的推移,订单单表的数据量势必会越来越大,而订单sql查询的时间也会越来越慢,为了提高sql的查询效率,同时也为了更好的扩展性,最终得要引入这套分库分表的方案。


来看一下分库分表版本的订单系统架构

引入分库分表的方案后,外卖订单系统的系统架构如下图:

图片

整个分层没有变化,分库分表后还是分为了三层,分别是访问层、服务层和数据层,还是从上到下逐一介绍:

1. 访问层:访问层使用的还是postman,这一层没有任何变化。

2. 服务层

  • 增加了根据路由key改写sql的功能,因为分库分表后会有多个库和表,比如订单库分为order_db_0和order_db_1。
  • 每个数据库中有多个订单表,比如order_db_0中有订单表order_info_0和order_info_1,这个时候,如果要往数据库中插入订单或查询订单,为了确定数据落在哪个库的哪个表中,就需要根据路由key来改写sql了,根据路由key改写sql采用ShardingSphere来实现。
  • 增加了数据迁移的功能,因为分库分表后,需要将之前单库中的数据迁移到新的库表中,比如这里分了8库8表,就会将原始单库中的数据迁移到新的8库8表中,数据迁移具体要用到全量同步、增量同步和数据验证等功能,数据迁移的功能会使用到canal和RocketMQ。

3. 数据层:还是使用MySQL,只不过会使用ShardingSphere来做sql改写和读写分离,然后在数据层还将引入缓存,缓存使用Redis来实现。


结束语

本节主要对整个外卖订单系统的背景、系统演进的过程、单库版本的系统架构和分库分表版本的系统架构,做了一个简单的介绍,后续就会围绕单库版本的订单系统来进行一步一步的优化,最终优化成分库分表版本的系统架构。

为了更好的阅读后续连载内容,建议读者认真查看单库版本和分库分表版本的系统架构图,了解当前订单系统架构是什么样子的,订单系统最终会做成什么样子,形成一个整体的认知。

V-xin:ruyuanhadeng获得600+页原创精品文章汇总PDF

另外推荐儒猿课堂的1元系列课程给您,欢迎加入一起学习~

互联网Java工程师面试突击课(1元专享)

SpringCloudAlibaba零基础入门到项目实战(1元专享)

亿级流量下的电商详情页系统实战项目(1元专享)

Kafka消息中间件内核源码精讲(1元专享)

12个实战案例带你玩转Java并发编程(1元专享)

Elasticsearch零基础入门到精通(1元专享)

基于Java手写分布式中间件系统实战(1元专享)

基于ShardingSphere的分库分表实战课(1元专享)

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通讯录——文件读写版本

通讯录最终版本——文件读写 前面在暴躁小猿给大家分享了通讯录的静态版本和动态版本,但是这两个版本都不能实现文件的读写,每次运行程序都不能保存和读取数据,这样的通讯录是不完善的,根本没有办法去使用,所以为了满足…

Java毕设项目在线点餐系统计算机(附源码+系统+数据库+LW)

Java毕设项目在线点餐系统计算机(附源码系统数据库LW) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

电源芯片的选择

什么是电源芯片?它有什么作用?在选择电源芯片的时候,应该考虑那些地方?输入电压线性调整率、输入电压线性变化时对输出电压的相对影响?下面先来了解几个概念问题: 1、输出电压负载调整率:负载电流变化时输出电压相对变化情况 …

(附源码)计算机毕业设计SSM在线考试主观题评分系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

神经网络适用于什么情况,神经网络是分类算法吗

1、人工神经网络评价法 人工神经元是人工神经网络的基本处理单元,而人工智能的一个重要组成部分又是人工神经网络。人工神经网络是模拟生物神经元系统的数学模型,接受信息主要是通过神经元来进行的。首先,人工神经元利用连接强度将产生的信号…

web响应式布局与BootStrap框架

目录什么是响应式网页布局媒体查询什么是媒体查询?媒体类型(mediatype)关键字媒体特性(media feature)引入方式BootStrap简介使用步骤栅格系统组件JavaScript插件定制案例腾讯前端web首页什么是响应式网页布局 响应式…

Excel工作日日历

在项目管理中,通常需要制作一个工作日历,能标识出休假日。 难点在识别休假日,不能简单根据周几来判断,而是要根据国家法定假日和换班日进行判断。我做了一个示例,给感兴趣的朋友演示一下。 我会分步骤讲解一下如何制作…

APS高级排产如何帮助帮助企业制定生产计划?

对于物料及产能规划与现场详细作业排程而言,企业常因无法确实掌握生产制造现场实际的产能状况及物料进货时程,而采取有单就接的接单政策与粗估产能的生产排程方式,但又在提高对顾客的服务水平及允诺交期的基本前提下,导致生产车间…

Redis配置文件详解

容量单位不区分大小写,G和GB有区别 可以使用 include 组合多个配置问题 网络配置 日志输出级别 日志输出文件 持久化规则 由于Redis是基于内存的数据库,需要将数据由内存持久化到文件中 持久化方式: RDBAOF RDB文件相关 主从复制 Security模…

【建立逻辑结构】

前言 这是【Windows Server 2016 服务器配置与管理】的一些实操 下面是我自己做实验过程当中的一些简单记录,可能会有小错误,欢迎大家的指正! Slogan:日拱一卒,功不唐捐!!! 问答题 …

【重识云原生】第四章云网络6.4.5.2节——Deployment配置详细说明

1 deployment配置说明 1.1 deployment的资源清单文件 主要字段说明: 全量字段说明: apiVersion: apps/v1 #版本号 kind: Deployment #类型 metadata: #元数据 name: #rs名称 namespace: #所属命名空间 labels: #标签 controller: deploy spec: #详…

Linux自动挂载 (autofs)

个人主页:💗wei_shuo的个人主页 🏀 Hello World !🏀 文章目录实现自动挂载-autofsautofs工具简单使用autofs配置详细说明自动挂载资源有两种格式:相对路径挂载法绝对路径挂载法优化 Linux 系统性能安装 Tun…

动态代理详解

想要更加透彻的理解动态代理,首先要熟悉下静态代理 一、静态代理 总结来说:目标类和代理类实现了相同的接口,在代理类中依赖了目标类,代理类的方法中调用了目标类的方法,并做了一些增强性的工作。 1、实现静态代理&…

ROS|乌龟TF变换案例分析

1. 相关源码内容 1.1 turtle_df_demo.launch <launch><!-- Turtlesim Node--><node pkg"turtlesim" type"turtlesim_node" name"sim"/><node pkg"turtlesim" type"turtle_teleop_key" name"tel…

如何快速创建 GCDW 实例

GCDW 实例需云用户注册 GCDW 租户成功后&#xff0c; GBASE 云服务系统给租户分配独 立的实例&#xff0c; 同时创建租户的数据库根用户&#xff0c; 根用户即为该实例的超户&#xff0c; 拥有该实例 的最高权限&#xff0c; 租户可以通过根用户登录自己的实例管理数据&#xf…

Centos7 单机单网卡 RDO 安装 OpenStack

文档 OpenStack 涵盖太多知识量&#xff0c;总是找不到一个称心的官方文档 OpenStack Installation Guide for Red Hat Enterprise Linux and CentOS 这个是中文版的&#xff0c;但是 UPDATED: 2017-06-12 11:14 &#xff0c;很古老了&#xff01;基本概念和思想还是一样的 h…

SiO2/罗丹明B荧光杂化纳米微球/硅钼比核壳结构二氧化硅微球钼酸钙荧光粉的性能

SiO2/罗丹明B荧光杂化纳米微球性能制备&#xff1a; 在甲苯存在下的反相微乳液体系中,将γ-缩水甘油醚氧丙基三甲氧基硅烷(KH560)与罗丹明B进行预反应&#xff1b;再与正硅酸乙酯( TEOS)经原位溶胶-凝胶反应,制备SiO2/罗丹明B荧光杂化纳米微球.通过FTIR、UV-Vis、TEM、TG和光致…

聚焦 | 电力行业国产操作系统迎来大市场,麒麟信安积极承接发展新机遇

近年来&#xff0c;针对信息安全的外部环境不确定性加剧&#xff0c;作为关系到国计民生的电力行业&#xff0c;加速了自主创新的步伐。 从2009年起&#xff0c;电力行业就开始采用拥有自主核心技术的软硬件设施&#xff0c;到如今&#xff0c;整个电力行业已普遍完成了调度自动…

4.<tag-排序和TopK问题的三种典型解法>补充: 面试题 17.14. 最小K个数 + lt.215-数组中的第K个最大元素 dbc

面试题 17.14. 最小K个数 [案例需求] TopK问题很普遍, 解题套路也很简单, 无非就是排序, 运用最基础的排序(如Array.sort(nums))复杂度为nlogn, 或者使用堆, 复杂度为nlogk, 或者在快排的基础上进行减治 详细参见此文: 点我 [思路分析一, 直接排序] 对原数组从小到大排序后取出…

毕业设计 深度学习 机器视觉 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过…