Vertx-java-HttpClient:如何导出 maxPoolSize 和 maxWaitQueueSize 值及其影响
Vertx-java-HttpClient: How to derive maxPoolSize and maxWaitQueueSize values and their impact
我在 vertx java 中创建了一个 java 后端服务。我使用 httpClient(io.vertx.core.http.HttpClient
) 并启用 连接池 来连接到外部服务。我排除了 50 的吞吐量。对于我的服务的每个请求,我都需要连接到外部服务。我的服务的平均响应时间是 4 秒,外部服务大约是 3 秒。
现在我的问题是
- 如何导出 HttpClient 的
maxPoolSize
和 maxWaitQueueSize
值?
maxPoolSize
和 maxWaitQueueSize
值对内存和 cpu 有何影响?
- 我可以设置为
maxPoolSize
和 maxWaitQueueSize
的最大值是多少?
- 我还应该使用
HttpClient
的 setPipelining
选项吗?
首先,请注意 maxPoolSize
适用于每个目的地。因此,如果您想要不同的池大小,请为您的后端创建不同的 HttpClient
。
然后,除非您在受限环境中工作,否则我建议将 maxWaitQueueSize
保留为默认值,即 -1
(无限制)。考虑到您期望的负载,内存中队列的大小应该相对较小。
要确定池大小值,您可以使用 Little's law。要支持平均 3 秒服务时间的 50 req/sec 吞吐量,您需要一个包含 150 个连接的池。
您可以为 maxPoolSize
设置的最大值取决于您系统的配置方式。特别是,您需要配置打开文件描述符的最大数量。
对于您的用例,我认为您应该避免启用流水线。首先,并非所有 HTTP 服务器都正确支持它。其次,如果服务时间在 0-3 秒之间变化,后端可能会保留响应,因为管道中的先前请求尚未处理(队头阻塞)。
我在 vertx java 中创建了一个 java 后端服务。我使用 httpClient(io.vertx.core.http.HttpClient
) 并启用 连接池 来连接到外部服务。我排除了 50 的吞吐量。对于我的服务的每个请求,我都需要连接到外部服务。我的服务的平均响应时间是 4 秒,外部服务大约是 3 秒。
现在我的问题是
- 如何导出 HttpClient 的
maxPoolSize
和maxWaitQueueSize
值? maxPoolSize
和maxWaitQueueSize
值对内存和 cpu 有何影响?- 我可以设置为
maxPoolSize
和maxWaitQueueSize
的最大值是多少? - 我还应该使用
HttpClient
的setPipelining
选项吗?
首先,请注意 maxPoolSize
适用于每个目的地。因此,如果您想要不同的池大小,请为您的后端创建不同的 HttpClient
。
然后,除非您在受限环境中工作,否则我建议将 maxWaitQueueSize
保留为默认值,即 -1
(无限制)。考虑到您期望的负载,内存中队列的大小应该相对较小。
要确定池大小值,您可以使用 Little's law。要支持平均 3 秒服务时间的 50 req/sec 吞吐量,您需要一个包含 150 个连接的池。
您可以为 maxPoolSize
设置的最大值取决于您系统的配置方式。特别是,您需要配置打开文件描述符的最大数量。
对于您的用例,我认为您应该避免启用流水线。首先,并非所有 HTTP 服务器都正确支持它。其次,如果服务时间在 0-3 秒之间变化,后端可能会保留响应,因为管道中的先前请求尚未处理(队头阻塞)。