震惊,线程共享变量使用不当引发血案

本文分析了一起线上虚拟订单错误使用实物订单Token的案例,详细探讨了问题出现的原因,涉及到Tomcat线程模型、ThreadLocal线程共享变量及Dubbo跨服务传参等知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说一下业务

下单前需要先发送token等一些信息给到风控审核。实物订单和虚拟订单是独立的两个API接口。

token信息是放在ThreadLocal线程共享变量中,通过dubbo的RpcContext隐式传参透传到后台。后台获取token发送风控审核。

再谈问题,线上出现了很多虚拟订单发送了实物订单的token,且重复率比较高。

原因:虚拟订单由于失误,没有设置token到ThreadLocal线程共享变量中。导致后面获取token时,取到了遗留在线程中实物订单设置的token。由于tomcat线程池中线程复用,所以会出现重复率较高的情况。

大致流程如下:

问题分析的难点

因为token属于敏感信息,生产环境不能打印到日志中,测试环境由于经常重启,很多线程变量未被实物订单的初始化,所以虚拟订单获取的token为空。没能复现生产中的问题。

该问题涉及的知识点还是比较多:

1,tomcat线程模型

2,线程共享变量使用

3,dubbo跨服务的传参

 

转载于:https://www.cnblogs.com/daghai/p/10966712.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值