模拟交易异步缓存问题故障排除总结

问题背景:

       在项目中存在两个需求。查询撤单列表,和 对列表中的订单进行撤单操作。出现的问题是,用户执行完撤单操作之后接着刷新列表,拿到了撤单之前的老数据,问题为偶发,但是偶发次数也较多。注:这一块是做了Redis缓存的。

问题初步定位:

1.初步分析有可能是缓存问题,查看日志显示缓存成功

查看Redis缓存数据,得知缓存中的数据的确为老历史数据。

2.由上可分析,是否是用户缓存数据之前并未对缓存数据进行清理?通过查看日志得出结论,缓存已经在用户重新缓存之前进行了清理。初步排除缓存问题的可能。

 

 

 

 

 

重新进行逻辑梳理:

分析整个撤单流程,用户发起撤单请求,后端接收到请求之后,将部分数据发送到Kafka中用于撮合删除对应的撮合队列,以阻止当前订单成交,代码如下 :

@RedissonLock(lockIndex = 0, leaseTime = 1)
@RedisCleanCache(key = RedisCommonKeys.TRADE_CACHE + "#{#accountId}")
public void cancelOrder(String accountId, Long commissionId) {
    //校验参数合法性
    AccountCommission accountCommission = checkCancelOrder(accountId, commissionId);
    log.info("开始执行撤单相关操作,accountId :{}, commissionId:{}", accountCommission.getAccountId(), accountCommission.getId());
    ...........
    commissionPlaceService.placeCommission(accountCommission);
}

撮合删除对应的撮合队列之后会将数据重新发回Kafka,后台接收到撮合发回的Kafka消息之后,执行撤单逻辑,所有逻辑均处在同一个事务中。代码如下:

public void doCancel(WithdrawMessage message) {
    AccountCommission commission =
        accountCommissionService.getOne(new LambdaQueryWrapper<AccountCommission>()
            .eq(AccountCommission::getId, message.getCommissionId())
            .in(AccountCommission::getCommissionStatus,
                Commi
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值