hystrix许多线程处于等待状态

时间:2019-02-04 09:56:58

标签: spring-boot spring-cloud-netflix hystrix netflix circuit-breaker

我们在其中一个模块中使用了hystrix-断路器模式[库]。 用例是:-我们正在轮询来自kafka的16条消息,并使用并行流对其进行处理,因此,对于工作流中的每条消息,都要进行3次rest调用,这些调用受hystric命令保护。现在,问题是当我尝试运行单个实例时,CPU显示峰值,而线程转储显示所有3条命令处于等待状态的许多线程。如下所示:-

省略了线程名,但假定所有所有线程池都显示相同的内容:-

  

线程池7”#82      线程状态:等待(停车)     在sun.misc.Unsafe.park(本机方法)     -停车以等待<0x000000004cee2312>(java.util.concurrent.SynchronousQueue $ TransferStack)     在java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)     在java.util.concurrent.SynchronousQueue $ TransferStack.awaitFulfill(SynchronousQueue.java:458)     在java.util.concurrent.SynchronousQueue $ TransferStack.transfer(SynchronousQueue.java:362)     在java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)     在java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)     在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)     在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)     在java.lang.Thread.run(Thread.java:748)

能否请您帮助我微调应用程序和线程池参数? 我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

Hystrix的默认隔离策略是线程池,默认大小仅为10。这意味着您的情况下只能同时运行10个REST调用。

首先,尝试将以下默认属性增加到大属性。

hystrix.threadpool.default.coreSize=1000  # default is 10

如果有效,则将该值调整为适当的值。 可以为每个线程池将default替换为正确的HystrixThreadPoolKey

如果您使用信号量隔离策略,请尝试增加以下内容。

hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=1000

以上默认值也仅为10。每个信号量的default都可以替换为HystrixCommandKey名称。

已更新

要选择隔离策略,可以使用以下属性。

hystrix.command.default.execution.isolation.strategy=THREAD or SEMAPHORE

default可以替换为HystrixCommandKey。这意味着您可以为每个hystrix命令分配不同的策略。