我们在其中一个模块中使用了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)
能否请您帮助我微调应用程序和线程池参数? 我在这里想念什么?
答案 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命令分配不同的策略。