高并发下springcloud hystrix的严重问题?

Posted

技术标签:

【中文标题】高并发下springcloud hystrix的严重问题?【英文标题】:serious issue of springcloud hystrix under high concurrency? 【发布时间】:2018-04-05 23:55:24 【问题描述】:

第 1 部分

我使用 HystrixCommand 进行服务,并使用 jmeter 进行高并发测试。测试结果太差了,看流。 代码->

@HystrixCommand(fallbackMethod = "helloFallback")
@RequestMapping(value="/hello", method=RequestMethod.GET)
@ResponseBody
public ResponseResult hello() throws Exception
    ResponseResult responseResult = new ResponseResult();
    responseResult.setCode(200);
    responseResult.setData("bank test ok");
    return responseResult;

public ResponseResult helloFallback()
    ResponseResult responseResult = new ResponseResult();
    responseResult.setCode(400);
    responseResult.setData("timeout error");
    return responseResult;

测试结果:jmeter_test1

第二部分

但是,如果我注释掉HystrixCommand,测试结果是完美的。代码->

//    @HystrixCommand(fallbackMethod = "helloFallback")
@RequestMapping(value="/hello", method=RequestMethod.GET)
@ResponseBody
public ResponseResult hello() throws Exception
    ResponseResult responseResult = new ResponseResult();
    responseResult.setCode(200);
    responseResult.setData("bank test ok");
    return responseResult;

public ResponseResult helloFallback()
    ResponseResult responseResult = new ResponseResult();
    responseResult.setCode(400);
    responseResult.setData("timeout error");
    return responseResult;

测试结果->jmeter_test2

提示:线程图片 jmeter_test3

无论我使用zuul直接转发和调用服务,测试结果都是一样的。那么是高并发时springcloud hystrix的问题还是我的代码有问题。欢迎任何回复!

【问题讨论】:

【参考方案1】:

首先,请尝试调整以下属性。

hystrix.threadpool.default.coreSize

默认线程池大小仅为 10,对于您的性能测试而言,它的大小非常小。

在您使用 hystrix 的第一次测试中,您可以看到 31% 的错误率。这可能意味着可能有很多线程池被拒绝,因为默认线程池只有 10 个。

如您所知,Hystrix 通过断路器提供了很好的隔离,并且需要一些成本来处理它。所以一些性能下降是无法避免的。但是你的测试结果看起来不正常。

你可以找到更多关于hystrix配置的细节here

【讨论】:

以上是关于高并发下springcloud hystrix的严重问题?的主要内容,如果未能解决你的问题,请参考以下文章

Java 高并发下的实践

解决高并发下System.currentTimeMillis卡顿

springboot~高并发下耗时操作的实现

高并发下的static类成员可能存在安全隐患

1. 网站高并发下的测试指标及优化泛谈

高并发下获取随机字符串