Bidfins 海量雅虎代拍订单、用户保证金流水单表突破 3000 万,查询卡顿严重。本文采用腾讯云 MySQL 一主四只读架构,按月 + 用户哈希双分表策略,提供保证金并发扣减、账单查询 Java 代码,财务对账速度提升 8.7 倍。
1. 保证金并发更新行锁冲突,出价高峰期超时;
2. 历史订单多维度索引失效,报表查询耗时 15s+;
3. 冷热数据混合存储,IO 负载居高不下。
1. 垂直分库:资金库、竞拍订单库、仓储 WMS 库独立实例;
2. 竞拍订单按 user_id 哈希分 32 张子表,账单按月分表;
3. 一主多读写分离,报表、用户查询全部走只读节点。
java
运行
@TableName("t_bid_order_${month}")public class YahooBidOrder {
private Long id;
private Long userId;
private String itemId;
private Integer bidType; //1雅虎 2煤炉
private BigDecimal priceJpy;
private Integer status;
private LocalDateTime createTime;}
java
运行
@Transactional(rollbackFor = Exception.class)public void deductUserMargin(Long userId, BigDecimal feeJpy) {
// 行锁锁定余额
Margin margin = marginMapper.selectByIdLock(userId);
if(margin.getBalanceJpy().compareTo(feeJpy) < 0){
throw new RuntimeException("保证金余额不足");
}
margin.setBalanceJpy(margin.subtract(feeJpy));
marginMapper.updateById(margin);
// 写入流水
MarginLog log = new MarginLog();
log.setUserId(userId);
log.setChangeJpy(feeJpy.negate());
log.setBizType(2);
logMapper.insert(log);}
java
运行
@DS("bid-read-slave")public List<MarginLog> queryUserBill(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);}
1. 数据库 TPS 1720 → 11600;
2. 对账查询耗时 16.2s → 1.8s;
3. 并发出价无锁等待超时。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。