概述
技术架构
DUBBO是一款非常优秀的 RPC 层框架,提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
RocketMQ是一款低延迟、高可靠、可伸缩、易于使用的消息中间件。
Redisson是架设在Redis基础上的一个Java驻内存数据网格。
Redis单线程的高速缓存数据库,支持持久化、事务,通过哨兵和自动分区提供高可用。
Druid阿里的开源软件,专为监控而生的数据库连接池。
Mybatis是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
MySQL关系型数据库系统。
库存扣减
1. 何时扣减
加购物车时扣减。商品加入购物车,并不能说明用户确实要购买,实际转化率并不高,假如此时扣库存,会导致库存被占用而无法释放,影响正常销售。
提交订单时扣减。用户下单后还有一个支付操作,如果用户仅仅下单而不进行支付,这部分库存将会被无效占用,影响正常销售。这里可以做一个支付时限,如果超过时限未支付,订单将被取消,预占得库存被返还。
支付时扣减。用户进行支付,说明交易即将完成,这部分是必须要留住的订单和用户,如果此时扣库存,出现库存不足导致用户支付失败会严重影响用户体验。
2. 如何扣减
用户误操作,前端购物车在用户提交订单后将购物车数据删除,无法继续提交。
黄牛绕过前段刷单,前端必须经过交易系统通过RPC调用库存系统,在交易系统中通过风控、调用次数限制、订单令牌等方法限制重复提交订单。
交易系统重试问题,库存系统通过限制一个订单只能进行一次事务性的库存扣减操作,防止交易系统重试导致的重复扣减。
还有重要的一点是记录库存扣减日志,在库存回滚时使用。
3. 如何回滚
数据库
1.Redis
分库分表,因垂直电商业务特点且主站秒杀和抢购并不在主站中,因此为简化逻辑按照SKU维度采用HASH算法进行分库的策略。当然在极端情况下可以对每个SKU继续进行库存拆分,拆分成二级SKU,目前秒杀业务就是采用这种策略。
读写分离,采用Master/Slave模式,其中Master提供写操作,Slave提供读操作,降低Master的压力,提供高速读写操作。
主从+哨兵模式,为保证Redis的可靠性,启用Redis的主从模式和哨兵模式。部署Sentinel集群+Master/Slave集群,实现Master故障的自动发现和切换。
持久化,启用AOF实时持久化功能,保障数据的秒级备份。