4

我在vertx java创建了一个 java 后端服务。我使用启用了连接池的httpClient ( io.vertx.core.http.HttpClient)来连接到外部服务。我排除了 50 的吞吐量。对于我的服务的每个请求,我都需要连接到外部服务。我的服务的平均响应时间是 4 秒,外部服务大约是 3 秒。

现在我的问题是

  1. 如何为 HttpClient派生maxPoolSize和取值?maxWaitQueueSize
  2. 对内存和cpu有什么影响maxPoolSize和价值?maxWaitQueueSize
  3. maxPoolSize我可以设置的最大值是maxWaitQueueSize多少?
  4. 我还应该使用setPipelining选项HttpClient吗?
4

1 回答 1

6

首先,请注意maxPoolSize适用于每个目的地。因此,如果您想要不同的池大小,HttpClient请为您的后端创建不同的池。

然后,除非您在受限环境中工作,否则我建议保留maxWaitQueueSize默认值,即-1(无界)。考虑到您期望的负载,内存中队列的大小应该相对较小。

要确定池大小值,您可以使用Little 定律。要支持 50 个请求/秒的吞吐量和平均 3 秒的服务时间,您需要一个包含 150 个连接的池。

您可以设置的最大值maxPoolSize取决于系统的配置方式。特别是,您需要配置打开文件描述符的最大数量。

对于您的用例,我相信您应该避免启用管道。首先,并非所有 HTTP 服务器都正确支持它。其次,如果服务时间在 0-3 秒之间变化,则后端可能会保留响应,因为管道中的先前请求尚未处理(行头阻塞)。

于 2020-01-17T16:48:11.593 回答