专栏首页波波烤鸭SpringCloud-Hystrix【解决灾难性雪崩-请求合并】

SpringCloud-Hystrix【解决灾难性雪崩-请求合并】

  本文我们来演示下Hystrix中解决雪崩效应的第三种方式请求合并的实现

Hystrix-请求合并

没有合并请求的场景

  没有合并的场景中,对于provider的调用会非常的频繁,容易造成处理不过来的情况

合并请求的场景

什么情况下使用请求合并

  在微服务架构中,我们将一个项目拆分成很多个独立的模块,这些独立的模块通过远程调用来互相配合工作,但是,在高并发情况下,通信次数的增加会导致总的通信时间增加,同时,线程池的资源也是有限的,高并发环境会导致有大量的线程处于等待状态,进而导致响应延迟,为了解决这些问题,我们需要来了解 Hystrix 的请求合并。

请求合并的缺点

  设置请求合并之后,本来一个请求可能 5ms 就搞定了,但是现在必须再等 10ms 看看还有没有其他的请求一起的,这样一个请求的耗时就从 5ms 增加到 15ms 了,不过,如果我们要发起的命令本身就是一个高延迟的命令,那么这个时候就可以使用请求合并了,因为这个时候时间窗的时间消耗就显得微不足道了,另外高并发也是请求合并的一个非常重要的场景。

案例演示

1.创建项目

  创建一个普通的SpringCloud项目

2.添加依赖

  将Hystrix的依赖添加即可

3.修改配置文件

  配置文件中设置对应的应用名称端口及eureka注册中心的信息即可

4.启动类修改

  启动类中开启@EnableCircuitBreaker注解。

5.业务层修改

  具体代码如下,要注意的是getUser方法的返回类型必须是Future类型,batchMethod 属性指定的是请求合并后要执行的方法的名称。

@Service
public class UserService {
    /**
     * consumer 的 controller 调用的方法
     * 该方法返回值必须要返回Future 类型
     * 利用 hystrix 合并请求
     */
    @HystrixCollapser(
            batchMethod = "batchUser"
            , scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL
            ,collapserProperties = {
                    //请求时间间隔在 20ms 之内的请求会被合并为一个请求,默认为 10ms
                    @HystrixProperty(name = "timerDelayInMilliseconds", value = "20"),
                    //设置触发批处理执行之前,在批处理中允许的最大请求数。
                    @HystrixProperty(name = "maxRequestsInBatch",value = "200"),
            })
    public Future<User> getUser(Integer id){
        System.out.println("----id---:"+id);
        return null;
    }

    /**
     * 调用 Provider 服务的方法
     * @param ids
     * @return
     */
    @HystrixCommand
    public List<User> batchUser(List<Integer> ids){
        for(Integer id:ids){
            System.out.println(id);
        }
        //假设是调用 provider 服务后返回的 list
        List<User> list = new ArrayList<>();
        list.add(new User(1, "张三",18));
        list.add(new User(2, "李四",19));
        list.add(new User(3, "王五",20));
        list.add(new User(4, "小明",21));
        list.add(new User(100,"小张",22));
        System.out.println("*************");
        return list;
    }
}

6.控制器调用

  调用service的方法,模拟多次请求的场景,具体如下

@RestController
public class UserController {

    @Autowired
    private UserService userService;
    @RequestMapping("/consumer")
    public void getUsers() throws Exception{

        Future<User> f1 = this.userService.getUser(1);
        Future<User> f2 = this.userService.getUser(2);
        Future<User> f3 = this.userService.getUser(3);
        System.out.println(f1.get().toString());
        System.out.println(f2.get().toString());
        System.out.println(f3.get().toString());
    }
}

7.测试

  启动服务后访问,查看控制台效果,发现虽然请求了多次service,但是batchUser方法只执行了一次

8.请求合并参数介绍

参数

作用/默认值

备注

@HystrixCollapser

batchMethod

合并请求的方法

scope

请求方式/REQUEST

请求方式分为REQUEST和GLOBAL。REQUEST范围只对一个request请求内的多次服务请求进行合并GLOBAL是多单应用中的所有线程的请求中的多次服务请求合并

timerDelayInMilliseconds

请求时间间隔在10ms之内的请求会被合并为一个请求/10ms

建议尽量设置的小一点,如果并发量不大的话,其实也没有必要使用HystrixCollapser来处理

maxRequestsInBatch

设置触发批处理执行之前,在批处理中允许的最大请求数/Integer.MAX_VALUE

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java工厂模式

      工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,工厂模式在Java程序中可以说是随处可见。本文来给大家详细介绍下工厂模式

    用户4919348
  • Spring RestTemplate介绍

      上篇文件介绍Eureka服务的文章中,我们介绍到consumer从Eureka中通过LoadBalancerClient获取到服务端地址信息后通过RestT...

    用户4919348
  • MapReduce之输出结果排序

      前面的案例中我们介绍了统计出每个用户的上行流量,下行流量及总流量,现在我们想要将输出的结果按照总流量倒序排序。

    用户4919348
  • 私藏已久的7个Python视频教程

    导读:有没有Python视频教程?有,甚至还有机会接触到国际顶尖大学的计算机视频课程。

    华章科技
  • 淘宝大秒系统设计详解

    大家还记得2013年的小米秒杀吗?三款小米手机各11万台开卖,走的都是大秒系统,3分钟后成为双十一第一家也是最快破亿的旗舰店。经过日志统计,前端系统双11峰值有...

    周三不加班
  • 手把手教你使用Python+scrapy爬取山东各城市天气预报

    1、在命令提示符环境使用pip install scrapy命令安装Python扩展库scrapy,详见Python使用Scrapy爬虫框架爬取天涯社区小说“大...

    Python小屋屋主
  • 【JavaWeb】101:表单校验

    registerForm是我项目中注册表单对应的id,通过id选择器可以选择注册表单,从而进一步校验。

    刘小爱
  • HTTP 实战(三) - HTTP各种特性总览

    8888服务提供的 html,html 文件中又向8887服务发送AJAX请求,这就是跨域了!

    JavaEdge
  • 3. 站在使用层面,Bean Validation这些标准接口你需要烂熟于胸

    通过前两篇文章的叙述,相信能勾起你对Bean Validation的兴趣。那么本文就站在一个使用者的角度来看,要使用Bean Validation完成校验的话我...

    YourBatman
  • Java编程解析—淘宝大秒杀系统设计

    最初的秒杀系统的原型是淘宝详情上的定时上架功能,由于有些卖家为了吸引眼球,把价格压得很低。但这给的详情系统带来了很大压力,为了将这种突发流量隔离,才设计了秒杀系...

    慕容千语

扫码关注云+社区

领取腾讯云代金券