分布式秒杀实战之订单数据分表

作者:微信小助手

发布时间:2020-08-27T20:38:07

点击▲关注 “ 爪哇笔记 ”   给公众号标星置顶
更多精彩 第一时间直达

前言

一般来说电商的日订单都是百千万级甚至是亿万级别的了,小小的数据库肯定是撑不住的,这时候就要提前考虑分库分表了。
国内一般大厂规则参考:
  • 单表500万条记录,正常水平

  • 800万条警戒线

  • 1000万条必须要分库分表

一般业界,对订单数据的分库分表,有两类思路:按照订单号来切分、按照用户id来切分,当然各有利弊,这里不细说。

手动分表

这个在秒杀一中已有体现,这里仅仅是分表而已,提供一种思路,供参考,测试的时候自行建表。
按照用户  ID 来做  hash 分散订单数据。为了减少迁移的数据量,一般扩容是以倍数的形式增加。比如原来是8个库,扩容的时候,就要增加到16个库,再次扩容,就增加到32个库。这样迁移的数据量,就小很多了。
这个问题不算很大问题,毕竟一次扩容,可以保证比较长的时间,而且使用倍数增加的方式,已经减少了数据迁移量。
 
String table = "success_killed_"+userId%8;
nativeSql = "INSERT INTO "+table+" (seckill_id, user_id,state,create_time)VALUES(?,?,?,?)";
Object[] params = new Object[]{seckillId,userId,(short)0,new Timestamp(System.currentTimeMillis())};
dynamicQuery.nativeExecuteUpdate(nativeSql,params);
手动撕业务逻辑是不是很 low?今天给大家推荐一款分表神器。

自动分表

墙裂推荐使用开源的分布式数据库中间件  ShardingSphere,资料丰富,入手简单, 并且已于2020年4月16日成为  Apache 软件基金会的顶级项目,值得信赖。
适用于任何基于 JDBCORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

  • 支持任意实现JDBC规范的数据库。目前支持 MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

集成 SpringBoot
案例使用  SpringBoot2.2.6.RELEASE + JPA,部分坐标请自行引入。
引入坐标 pom.xml
 
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<