Hystrix 线程池策略时使用ThreadLocal
创始人
2024-11-13 05:08:59
0

背景

分页查询单据时,由于单据表数据量很大,单月达到了千万级别,所以,查询先走ES,当ES不可用时,降级走mysql,降级使用了 Hystrix,并且是线程池策略,在实际测试过程中,发现前端提供相同查询参数时,后端会返回不同的响应结果,十分怪异,经排查,组装查询条件时,从上下文里获取了参数,而这些参数是放在 ThreadLocal 里的,ThreadLocal 在不同线程之间的数据隔离是通过每个线程都有一个独立的  ThreadLocal 存储来实现的。然而,Hystrix 使用线程池来实现隔离和限流,这意味着请求可能会在线程池中的不同线程之间切换。这可能导致  ThreadLocal 的数据被意外共享或者丢失。

解决方案

自定义一个 HystrixConcurrencyStrategy,在每次任务执行时正确传递 ThreadLocal 数据。

HystrixConcurrencyStrategy 是 Hystrix 提供的一个扩展点,用于自定义并发执行的行为。通过自定义该策略,可以在 Hystrix 的执行上下文中正确管理 ThreadLocal

public class MyConcurrencyStrategy extends HystrixConcurrencyStrategy {     private HystrixConcurrencyStrategy existingConcurrencyStrategy;      public MyConcurrencyStrategy(HystrixConcurrencyStrategy existingConcurrencyStrategy) {         this.existingConcurrencyStrategy = existingConcurrencyStrategy == null              ? HystrixConcurrencyStrategyDefault.getInstance() : existingConcurrencyStrategy;     }      @Override     public  Callable wrapCallable(Callable callable) {         return new WrappedCallable<>(callable);     }      private static class WrappedCallable implements Callable {         private final Callable actual;         private final Map, Object> threadLocals;          public WrappedCallable(Callable actual) {             this.actual = actual;             this.threadLocals = captureThreadLocals();         }          @Override         public T call() throws Exception {             Map, Object> originalThreadLocals = captureThreadLocals();             restoreThreadLocals(threadLocals);             try {                 return actual.call();             } finally {                 restoreThreadLocals(originalThreadLocals);             }         }          private Map, Object> captureThreadLocals() {             Map, Object> threadLocals = new HashMap<>();             // Capture current ThreadLocal values             return threadLocals;         }          private void restoreThreadLocals(Map, Object> threadLocals) {             // Restore ThreadLocal values         }     } } 

相关内容

热门资讯

玩家攻略,游戏推荐牛牛房卡出售... 玩家攻略,游戏推荐牛牛房卡出售高朋联盟/房卡怎么买Sa9Ix苹果iPhone 17手机即将进入量产阶...
玩家攻略,金花微信链接市场价格... 您好!微信朱雀大厅大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(朱雀大厅)大厅介绍:...
玩家攻略,金花微信链接市场价格... 今 日消息,天酷大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
头条推荐!微信金花房卡怎么弄神... 头条推荐!微信金花房卡怎么弄神龙大厅/微信链接房卡价格一览表神龙大厅是一款非常受欢迎的游戏,咨询房/...
软件炸金花模式创建开房卡/购买... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
头条推荐!牛牛房卡批发平台新大... 头条推荐!牛牛房卡批发平台新大圣/大圣大厅/微信链接房间卡怎么购买Sa9Ix苹果iPhone 17手...
我来教你/斗牛房间怎么创建的卡... 今 日消息,卡贝大厅/新上游房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更...
正版授权!牛牛房卡哪里有卖的金... 正版授权!牛牛房卡哪里有卖的金辰娱乐/房卡购买房间怎么开金辰娱乐是一款非常受欢迎的游戏,咨询房/卡添...
微信牛牛房卡购买方法/微信牛牛... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享受...
推荐一款!游戏微信牛牛房卡新超... 今 日消息,新超圣/樱花大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更...
分享!微信炸金花链接在哪买房卡... 微信游戏中心:炸金花房卡,添加微信【33699510】,进入游戏中心或相关小程序,搜索“微信炸金花房...
ia攻略/牛牛充值房卡泡泡娱乐... 泡泡娱乐房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
头条推荐!牛牛房卡官网星空乐娱... 头条推荐!牛牛房卡官网星空乐娱/房卡哪家便宜星空乐娱是一款非常受欢迎的游戏,咨询房/卡添加微信:88...
头条推荐!金花房卡专卖店新二号... 微信游戏中心:新二号房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程序...
ios系统如何使用安卓系统软件... 你有没有想过,你的iPhone上那些让人爱不释手的安卓系统软件?是不是有时候觉得,要是我的iOS设备...
科技实测!牛牛房卡游戏代理飞鹰... 您好!微信飞鹰互娱大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(飞鹰互娱)大厅介绍:...
ia攻略/牛牛房卡制作链接九哥... 今 日消息,九哥联盟房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
正版授权!微信金花房卡怎么弄黑... 正版授权!微信金花房卡怎么弄黑鹰众玩/微信链接哪里购买房卡黑鹰众玩是一款非常受欢迎的游戏,咨询房/卡...
给大家讲解“微信金花房卡招代理... 人海大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来...
IA解析/牛牛房卡制作链接海蓝... 微信游戏中心:海蓝大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...