Spring boot 如果queueCapacity为0,Spring引导线程池执行器rest模板行为会降低rest API应用程序的性能

Spring boot 如果queueCapacity为0,Spring引导线程池执行器rest模板行为会降低rest API应用程序的性能,spring-boot,resttemplate,java.util.concurrent,threadpoolexecutor,blockingqueue,Spring Boot,Resttemplate,Java.util.concurrent,Threadpoolexecutor,Blockingqueue,我遇到了一个奇怪的问题,无法找到它的根本原因。这是我的rest模板线程池执行器: connectionRequestTimeout: 60000 connectTimeout: 60000 socketTimeout: 60000 responseTimeout: 60000 connectionpoolmax: 900 defaultMaxPerRoute: 20 corePoolSize: 10 maxPoolSize: 300 queueCapacity

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

  connectionRequestTimeout: 60000
  connectTimeout: 60000
  socketTimeout: 60000
  responseTimeout: 60000
  connectionpoolmax: 900
  defaultMaxPerRoute: 20
  corePoolSize: 10
  maxPoolSize: 300
  queueCapacity: 0
  keepAliveSeconds: 1
  allowCoreThreadTimeOut: true
1) 我知道队列容量为0,线程池执行器将创建SynchronousQueue。第一个问题是,如果我将其值设为正整数值(如50),则应用程序性能将下降。根据我的理解,我们应该只在极少数情况下使用SynchronouseQueue,而不是在像我这样基于spring boot rest API的应用程序中

2) 第二件事是,我想了解SynchronousQueue在部署在服务器(tomcat)上的spring boot rest API应用程序中是如何工作的。我知道SynchronousQueue的容量为零,所以生产者会阻塞,直到消费者可用或创建线程。但世卫组织消费者和生产者在这种情况下,因为所有请求都由一个web或应用服务器提供服务。在这种情况下SynchronousQueue基本上是如何工作的

我通过在我的机器上运行JMeter脚本来检查性能。此脚本可以处理队列容量为0而不是某些大于0的情况

我真的很感谢您的任何见解。

1)不要显式地设置队列容量,否则势必会降低性能。因为我们限制了可以驻留在队列中的传入请求,一旦某个线程从固定线程池中可用,它就会被占用

ThreadPoolTaskExecutor具有核心池的默认配置 大小为1,具有无限的最大池大小和无限的队列容量

2) 在SynchronousQueue中,插入和删除操作对总是同时发生,因此队列实际上从不包含任何内容。它同步地将数据传递给另一个线程,它等待另一方获取数据,而不是仅仅放置数据并返回

阅读更多:

  • 我希望我的回答能在一个方面对您有所帮助。

    1)不要显式设置队列容量,否则会降低性能。因为我们限制了可以驻留在队列中的传入请求,一旦某个线程从固定线程池中可用,它就会被占用

    ThreadPoolTaskExecutor具有核心池的默认配置 大小为1,具有无限的最大池大小和无限的队列容量

    2) 在SynchronousQueue中,插入和删除操作对总是同时发生,因此队列实际上从不包含任何内容。它同步地将数据传递给另一个线程,它等待另一方获取数据,而不是仅仅放置数据并返回

    阅读更多:


  • 我希望我的回答能对您有所帮助。

    谢谢您的回答。根据您的第一条评论,如果我们不应该明确定义queueCapacity,那么我们应该使用什么标准来定义此属性?我们应该为此使用默认值吗?其次,假设线程池中的所有线程都很忙。现在出现了一个新的请求,在同步队列的情况下,它必须等待其他线程释放,否则它将抛出异常?欢迎。queueCapacity=0定义大小为0的有界队列。因此,如果所有线程都很忙,新的请求就会进来,理想情况下,它应该排队。在您的配置中,当您将大小设置为0时,不会发生这种情况。对于第二个问题,是的,它将抛出一个RejectedExecutionException。更多上下文:,这篇文章也应该有帮助。谢谢你的回答。根据您的第一条评论,如果我们不应该明确定义queueCapacity,那么我们应该使用什么标准来定义此属性?我们应该为此使用默认值吗?其次,假设线程池中的所有线程都很忙。现在出现了一个新的请求,在同步队列的情况下,它必须等待其他线程释放,否则它将抛出异常?欢迎。queueCapacity=0定义大小为0的有界队列。因此,如果所有线程都很忙,新的请求就会进来,理想情况下,它应该排队。在您的配置中,当您将大小设置为0时,不会发生这种情况。对于第二个问题,是的,它将抛出一个RejectedExecutionException。更多上下文:,这篇文章也应该有帮助。