TaurusDB MySQL 分布式分表承载 Bidfins 海量雅虎代拍订单实战
摘要
Bidfins 海量竞拍、保证金单表千万级卡顿,基于华为云 TaurusDB 读写分离 + 按月分表,提供 MyBatis 分表代码、保证金并发更新事务代码,账单查询速度提升 9 倍。
一、痛点
保证金并发更新行锁、历史订单查询慢、财务对账报表超时。
二、方案
垂直分库:资金库 / 竞拍库 / WMS 仓储库;竞拍订单按 user_id 哈希分 32 表,账单按月分表,1 主 4 只读分离。
三、核心 Java 代码
1)分表 Mapper(MyBatis-Plus)
java
运行
// 竞拍订单实体 按月分表后缀 _202606@TableName("t_bid_order_${month}")public class BidOrder {
private Long id;
private Long userId;
private String itemId; //雅虎/煤炉商品ID
private Integer bidType; //1雅虎代拍 2煤炉自动代拍
private BigDecimal priceJpy;
private Integer status;
private LocalDateTime createTime;}
2)保证金并发扣减事务(TaurusDB 行锁)
java
运行
@Transactional(rollbackFor = Exception.class)public void deductMargin(Long userId, BigDecimal feeJpy) {
// 悲观行锁 SELECT ... FOR UPDATE
Margin margin = marginMapper.selectByIdLock(userId);
if(margin.getBalanceJpy().compareTo(feeJpy) < 0){
throw new RuntimeException("保证金余额不足");
}
margin.setBalanceJpy(margin.getBalanceJpy().subtract(feeJpy));
marginMapper.updateById(margin);
// 写入资金流水
MarginLog log = new MarginLog();
log.setUserId(userId);
log.setChangeJpy(feeJpy.negate());
log.setType(2); //竞拍扣费
logMapper.insert(log);}
3)读写分离调用示例
java
运行
// 注解走只读节点 查询历史账单@DS("bid-read")public List<MarginLog> listUserLog(Long userId, LocalDate start, LocalDate end) {
LambdaQueryWrapper<MarginLog> wrapper = Wrappers.lambdaQuery();
wrapper.eq(MarginLog::getUserId, userId);
wrapper.between(MarginLog::getCreateTime, start, end);
return marginLogMapper.selectList(wrapper);}
四、指标
单库 TPS 1800→12000;对账查询 16s→1.7s;资金无锁等待超时。
- 点赞
- 收藏
- 关注作者
评论(0)