Hystrix:HystrixCollapser请求合并

偶尔在spring4all,看到DiDi关于hystrix请求合并的一篇文章 Spring Cloud Hystrix的请求合并,查阅资料又整理了一下。

具体业务概念,什么是请求合并?请求合并优缺点?可以参考DiDi的文章,然后我把我使用过程中的问题及解决方法写出来

代码

合并请求服务实现

 @HystrixCollapser(batchMethod = "testAll", collapserProperties = {
        @HystrixProperty(name = "timerDelayInMilliseconds", value = "3000")
})
public Future<Demo> test(String param) {
    return null;
}

@HystrixCommand
public List<Demo> testAll(List<String> params) {
    logger.info("合并操作线程 --> {} --> params --> {}", Thread.currentThread().getName(), params);
    return restTemplate.getForObject("http://DEMO-SERVICE/demo?params={1}", List.class, StringUtils.join(params, ","));;
}

对外请求接口定义:

@RequestMapping("/test")
public SysDict test() throws ExecutionException, InterruptedException {
    //开启上下文TheardLocal
    HystrixRequestContext context = HystrixRequestContext.initializeContext();
    Future<Demo> demo1 = testService.test(RandomUtil.randomNumbers(5));
    Future<Demo> demo2 = testService.test(RandomUtil.randomNumbers(5));
    System.out.println(demo1.get());
    System.out.println(demo2.get());
    context.close();
    return null;
}

效果如下:

  • 如图两次调用Service.test()被合并成一次服务调用。

如果我请求两次接口也就是会调用四次Service.test(),那么会合并成几次服务调用呢?

  • 如图,两次请求还是被合并成了两次服务调用。

怎么实现两次请求,合并成一次服务调用?

@HystrixCollapser scope属性
//所有线程的请求中的多次服务请求进行合并。
Scope.GLOBAL;
//默认,对一次请求的多次服务调用合并
Scope.REQUEST; 

改造后代码:

 @HystrixCollapser(batchMethod = "testAll", scope = Scope.GLOBAL, collapserProperties = {
    @HystrixProperty(name = "timerDelayInMilliseconds", value = "3000")
})
public Future<Demo> test(String param) {
    return null;
}

改造后效果:

总结

  1. 这里单个请求的service 返回的 Future 包装的对象,如果使用原对象,则是同步请求,不会合并。
  2. HystrixRequestContext 接口访问需要开启上下文对象,其实就是使用TheardLoacl 初始化一个上下文对象。
  3. 暂时还不支持 feign 整合
  4. @HystrixCollapser Scope.REQUEST Scope.GLOBAL 合并作用域的区别
  5. 源码可以参考:https://gitee.com/log4j/pig

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的django

Django rest framework源码分析(2)----权限

添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # utils/permi...

40510
来自专栏Java技术栈

Spring bean - scope详解

Scope是定义Spring如何创建bean的实例的。 在创建bean的时候可以带上scope属性,scope有下面几种类型。 Singleton 这也是Spr...

28811
来自专栏Java成神之路

Spring_总结_04_高级配置(四)_bean的作用域

Spring应用上下文中所有的bean默认都是单例的。也就是说,不管一个bean被注入到其他bean多少次,每次注入的都是同一个实例。

942
来自专栏PhpZendo

MongoDB 学习笔记

感谢 Karl Seguin 编写的 The Little MongoDB Book 这本 MongoDB 入门书。

1181
来自专栏腾讯数据库技术

比ls快8倍?百万级文件遍历的奇技淫巧

1.2K4
来自专栏用户2442861的专栏

使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置

访问GitHub下载最新源码:https://github.com/gaussic/SpringMVCDemo

3221
来自专栏杨建荣的学习笔记

用shell帮助解决ORA问题

今天碰到一个设计的严重问题,由于使用了外部文件来和sqlplus交互 sql大体结构如下 select xxxxx from xxxxx where table...

3115
来自专栏Linux驱动

第3阶段——内核启动分析之start_kernel初始化函数(5)

内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只...

30810
来自专栏一个会写诗的程序员的博客

CAS指令与MESI缓存一致性协议、 “轻量级锁” 与原子操作CAS指令与MESI缓存一致性协议、 “轻量级锁” 与原子操作

CAS指令,在Intel CPU上称为CMPXCHG。最常见的原子操作有Compare and Exchange,Self Increase/Decrease等...

1715
来自专栏王磊的博客

Java核心(三)并发中的线程同步与锁

乐观锁、悲观锁、公平锁、自旋锁、偏向锁、轻量级锁、重量级锁、锁膨胀...难理解?不存的!来,话不多说,带你飙车。

1242

扫码关注云+社区

领取腾讯云代金券