spring引导线程池执行器rest模板queuecapacity为0时的行为会降低restapi应用程序的性能

uqdfh47h  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(549)

我被一个奇怪的问题困住了,找不到它的根本原因。这是我的rest模板线程池执行器:

connectionRequestTimeout: 60000
  connectTimeout: 60000
  socketTimeout: 60000
  responseTimeout: 60000
  connectionpoolmax: 900
  defaultMaxPerRoute: 20
  corePoolSize: 10
  maxPoolSize: 300
  queueCapacity: 0
  keepAliveSeconds: 1
  allowCoreThreadTimeOut: true

1) 我知道由于queuecapacity为0,线程池执行器将创建synchronusqueue。第一个问题是,如果我将其值设为正整数值(如50),则应用程序性能会下降。根据我的理解,我们应该只在极少数情况下使用synchronousequeue,而不是像我这样在基于springboot-restapi的应用程序中使用synchronousequeue。
2) 第二件事是,我想了解synchronousqueue如何在部署在服务器(tomcat)上的spring boot restapi应用程序中工作。我知道synchronousqueue的容量为零,所以生产者会阻塞,直到消费者可用,或者创建了线程。但在本例中,谁是消费者和生产者,因为所有请求都由web或应用程序服务器提供服务。在这种情况下synchronousqueue基本上是如何工作的?
我正在我的机器上运行jmeter脚本来检查性能。此脚本可以处理更多queuecapacity为0的情况,而不是某些大于0的情况。
我真的很感激你的洞察力。

7kjnsjlb

7kjnsjlb1#

1) 不要显式地设置queuecapacity,否则,它必然会降低性能。因为我们限制了可以驻留在队列中的传入请求,一旦某个线程从固定线程池中可用,它就会被占用。
threadpooltaskexecutor的默认配置核心池大小为1,最大池大小不受限制,队列容量不受限制。
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/concurrent/threadpooltaskexecutor.html
2) 在synchronousqueue中,insert和remove操作对总是同时发生,因此队列实际上从不包含任何内容。它将数据同步地传递给另一个线程,等待另一方获取数据,而不只是放入数据并返回。
阅读更多:
https://javarevisited.blogspot.com/2014/06/synchronousqueue-example-in-java.html#ixzz6pfz4akom
https://www.baeldung.com/thread-pool-java-and-guava
我希望我的回答能对你有所帮助。

相关问题