带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(13)

简介: 带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(13)

带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(12)https://developer.aliyun.com/article/1340057?groupCode=taobaotech


image.pngBad case:XX项目权益领取失败问题

在某权益领取原有链路中,通过app打开一级页面后才能发起权益领取请求,请求经过淘系无线网关(Mtop)后到达服务端,服务端通过mtop sdk获取当前会话信息。

 

在XX项目中,对权益领取链路进行了升级改造,在一级页面请求时,通过服务端同时发起权益领取请求。具体地, 服务端在处理一级页面请求时,同时通过调用hsf/dubbo接口来进行权益领取,因此在发起rpc调用时需要携带用户当前会话信息,在服务提供端将会话信息进行提取并注入到mtop上下文,从而才能通过mtop  sdk获取到会话id等信息。某开发同学在实现时,因ThreadLocal使用不当造成下述问题:

 

1.问题1:因ThreadLocal初始化时机不当,造成获取不到会话信息,进而导致权益领取失败;

2.问题2:请求完成时,因未清理ThreadLocal中的变量值,导致脏数据;

 

【问题1:权益领取失败分析】

在权益领取服务中,该应用构建了一套高效和线程安全的依赖注入框架,基于该框架的业务逻辑模块通常抽象为xxxModule形式,Module间为网状依赖关系,框架会按依赖关系自动调用init方法(其中,被依赖的module 的init 方法先执行)。

在应用中,权益领取接口的主入口为CommonXXApplyModule类,CommonXXApplyModule依赖XXSession-   Module。当请求来临时,会按依赖关系依次调用init方法,因此XXSessionModule的init方法会优先执行;而开发同学在CommonXXApplyModule类中的init方法中通过调用recoverMtopContext()方法来期望恢复mtop上下文,因recoverMtopContext()方法的调用时机过晚,从而导致XXSessionModule模块获取不到正确的会话id等信   息而导致权益领取失败。

 

image.png

 

 

【问题2:脏数据分析】

权益领取服务在处理请求时,若当前线程曾经处理过权益领取请求,因ThreadLocal变量值未被清理,此时XXSessionModule通过mtop SDK获取会话信息时得到的是前一次请求的会话信息,从而造成脏数据。

 

 

 

【解决方案】

在依赖注入框架入口处AbstractGate#visit(或在XXSessionModule中)通过recoverMtopContext方法注入 mtop上下文信息,并在入口方法的finally代码块清理当前请求的threadlocal变量值。

 

带你读《2022技术人的百宝黑皮书》——合理使用线程池以及线程变量(14)https://developer.aliyun.com/article/1340055?groupCode=taobaotech

相关文章
|
15天前
|
安全 Java 调度
Java语言多线程编程技术深度解析
Java语言多线程编程技术深度解析
288 1
|
16天前
|
缓存 监控 安全
Java的线程池和线程安全
Java的线程池和线程安全
|
10天前
|
缓存 Java 测试技术
Java性能优化(八)-多线程调优-线程池大小设置
Java性能优化(八)-多线程调优-线程池大小设置
11 0
|
12天前
|
开发框架 监控 Java
【.NET Core】多线程之线程池(ThreadPool)详解(二)
【.NET Core】多线程之线程池(ThreadPool)详解(二)
30 3
|
12天前
|
SQL 开发框架 Java
【.NET Core】多线程之线程池(ThreadPool)详解(一)
【.NET Core】多线程之线程池(ThreadPool)详解(一)
22 2
|
15天前
|
安全 算法 Java
Java中的并发编程技术:解锁高效多线程应用的秘密
Java作为一种广泛应用的编程语言,其并发编程技术一直备受关注。本文将深入探讨Java中的并发编程,从基本概念到高级技巧,帮助读者更好地理解并发编程的本质,并学会如何在多线程环境中构建高效可靠的应用程序。
|
15天前
|
存储 安全 Java
Java语言中的多线程编程技术深入解析
Java语言中的多线程编程技术深入解析
220 1
|
15天前
|
安全 Java
JAVA语言中的多线程编程技术
JAVA语言中的多线程编程技术
|
15天前
|
Java 调度
Java的线程创建与生命周期技术性详解
Java的线程创建与生命周期技术性详解
27 0
|
15天前
|
缓存 安全 Java
Java的线程池与并发工具类技术性文章
Java的线程池与并发工具类技术性文章
12 0