我正在使用需要从Rest API请求数据的客户端应用程序。这些请求中有许多是独立的,因此可以异步调用。我正在使用ThreadPoolExecutor来执行此操作,并且我已经看到可以使用以下参数对其进行配置:


corePoolSize
maxPoolSize
队列容量


我读了this article并且了解以下内容:


corePoolSize是执行程序在其下方添加一个新线程而不是将其排队的值
maxPoolSize是一个值,在该值之上,执行者将请求排队
如果实际线程数在corePoolSize和maxPoolSize之间,则将请求排队。


但是我有一些问题:


我一直在测试,corePoolSize越高,得到的效果越好。在生产环境中,有很多客户向此Rest API提出请求(每天可能数百万),corePoolSize应该有多高?
如何采取行动以获得“最佳”参数?仅通过测试?
(每个参数的)高/低值会导致哪些问题?


先感谢您

更新

我当前的值是:


corePoolSize = 5
maxPoolSize = 20
queueCapacity = 100

最佳答案

corePoolSize是保持在池中的线​​程数,即使它们处于空闲状态,除非设置了{@code allowCoreThreadTimeOut}
maximumPoolSize是池中允许的最大线程数


corePoolSize是您想要一直等待的线程数,即使没有人请求它们。 maximumPoolSize是要启动的Rest API的最大线程数,因此是并发请求数。


您每秒有多少个请求? (每秒的平均值/最大值)。
一个请求需要多长时间?
用户的最大可接受等待时间多长时间?


corePoolSize >= requests per second * seconds per request

maximumPoolSize >= maximum requests per second * seconds per request

queueCapacity <= maximumPoolSize * maxWaitTime / timePerRequest(您应该对此进行监视,以便知道何时必须采取行动。)

您必须记住,Rest API或您自己的应用程序/服务器/带宽可能会对并发连接数施加一些限制,并且许多并发请求可能会增加每个请求的时间。

我宁愿将corePoolSize保持在较低水平,将keepAliveTime保持在较高水平。

您必须记住,每个线程仅为并行HTTP请求增加了相当多的开销,应该有一个NIO变体来执行此操作,而无需大量线程。也许您可以尝试Apache MINA

10-06 05:11