# 《Seckill秒杀系统》第75章:预约系统整合分库分表

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:实现预约系统业务整合商品预约配置信息的分库分表,并且整合用户预约商品记录信息的分库分表,重点理解分库分表的设计思想和落地实现,并能够将其灵活应用到实际项目中。

大家好,我是冰河~~

秒杀的交易链路相对来说比较复杂,交易链路上每一个服务和系统都需要做到高并发、高性能、高可用和高可扩展,能够实现弹性伸缩。预约系统作为秒杀链路上一个非常重要的系统,其性能、可用性和可靠性也是不容忽视的。目前,我们已经完成了对预约系统的分库分表设计和实现。

# 一、前言

对秒杀商品开通预约通道后,只有成功预约过商品的用户才能抢购下单。这在一定程度上限制了参与秒杀抢购的用户人数,从而在一定程度上限制了进入秒杀系统的流量。将进入秒杀系统的流量控制在预期范围内,从而根据预约过商品的人数,并结合现有秒杀系统的资源来粗略评估是否需要对秒杀系统进行扩容,扩容多少资源等等。

评估这些数据的大部分依据就来自于预约系统中预约商品的人数,并结合以往秒杀活动过程中的流量数据,再加上对秒杀系统的全链路压测,最终得出是否需要对秒杀系统进行扩容,扩容多少资源等等。

# 二、本章诉求

从预约系统的源码层面整合分库分表,能够按照商品维度对商品的预约配置和商品的预约记录进行分库分表,并且能够按照用户维度对商品的预约记录进行分库分表,能够在预约系统中正确开通秒杀商品预约通道,并且用户能够正确预约商品。同时,配置好秒杀商品的预约配置信息后,并且用户正确预约了秒杀商品时,用户能够正常进行抢购下单。

# 三、整合分库分表

预约流程整合分库分表的核心逻辑就在预约系统中,另外,还会有一些细节上的调整。本节,就简单介绍下预约流程整合分库分表最核心的流程关于其他细节部分,大家可以阅读本章对应的源码分支。

预约系统整合分库分表的核心逻辑比较简单,主要就是修改基础设施层的源码,具体步骤如下所示。

(1)新增SeckillReservationGoodsMapper接口

SeckillReservationGoodsMapper接口的源码详见:seckill-reservation-infrastructure工程下的io.binghe.seckill.reservation.infrastructure.mapper.SeckillReservationGoodsMapper。

public interface SeckillReservationGoodsMapper {
    List<SeckillReservationUser> getUserListByGoodsId(@Param("goodsId") Long goodsId, @Param("status") Integer status);
    int reserveGoods(SeckillReservationUser seckillReservationUser);
    int cancelReserveGoods(@Param("goodsId") Long goodsId, @Param("userId") Long userId);
}
1
2
3
4
5

(2)新增SeckillReservationUserMapper接口

SeckillReservationUserMapper接口的源码详见:seckill-reservation-infrastructure工程下的io.binghe.seckill.reservation.infrastructure.mapper.SeckillReservationUserMapper。

public interface SeckillReservationUserMapper {
    List<SeckillReservationUser> getGoodsListByUserId(@Param("userId") Long userId, @Param("status") Integer status);
    int reserveGoods(SeckillReservationUser seckillReservationUser);
    int cancelReserveGoods(@Param("goodsId") Long goodsId, @Param("userId") Long userId);
    SeckillReservationUser getSeckillReservationUser(@Param("userId") Long userId, @Param("goodsId") Long goodsId, @Param("status") Integer status);
}
1
2
3
4
5
6

对应的Mapper接口的XML文件,大家可以下载本章对应的源码分支进行查看,这里不再赘述。

(3)修改SeckillReservationRepositoryImpl类

SeckillReservationRepositoryImpl类的源码详见:seckill-reservation-infrastructure工程下的io.binghe.seckill.reservation.infrastructure.repository.SeckillReservationRepositoryImpl。主要的修改步骤如下所示。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码