VertX 代理性能
VertX Proxy Performance
我正在尝试使用 Vertx 和 Vertx 客户端实现代理,类似于 https://github.com/vert-x/vertx-examples/blob/master/src/raw/java/proxy/ProxyServer.java 但带有路由器。
例外情况是它连接到多个服务器而不是单个服务器。
我连接了两种类型的服务
- 简单回显服务
- 在回显之前休眠 5 秒的服务
如果我为代理使用共享 HttpClient
并且我连接到一个简单的回显服务,我没有大的延迟问题,它的中值不到一秒,但是如果我连接到一个休眠服务随着时间和负载的增加,延迟会变高
如果我直接访问该服务,我会得到平均 5100 毫秒的预期延迟
现在,如果我改为为每个请求创建一个新的 HttpClient,它能够提供大约 5110 毫秒的良好延迟。但是,如果我用它来击中 echo 版本,它就会中断,并且 artillery 应用程序会给我一个 EADDRINUSE 错误(这很奇怪,因为它通常在 listen
一侧)
我使用的是 HTTP 而不是 HTTP/2,因为服务不在 SSL 上,所以我没有尝试过单连接多路复用
我还为代理使用保守的 64MB 堆大小。
创建一个新的 HttpClient
是否更合适,也许失败的原因是因为我只是在一台不合适的机器上测试可笑的负载?
为了解决这个问题,我必须在客户端尝试获得响应时应用 back-pressure pattern
final HttpClientRequest clientRequest = httpClient
.request(contextRequest.method(), clientRequestOptions, clientResponse -> {
contextRequest.response().setChunked(clientResponse.getHeader(HttpHeaders.CONTENT_LENGTH) == null)
.setStatusCode(clientResponse.statusCode());
clientResponse.headers().forEach(e -> contextRequest.response().putHeader(e.getKey(), e.getValue()));
clientResponse.endHandler(v -> {
contextRequest.response().end();
});
// back pressure here
Pump.pump(clientResponse, contextRequest.response()).start();
}).exceptionHandler(context::fail)
我正在尝试使用 Vertx 和 Vertx 客户端实现代理,类似于 https://github.com/vert-x/vertx-examples/blob/master/src/raw/java/proxy/ProxyServer.java 但带有路由器。
例外情况是它连接到多个服务器而不是单个服务器。
我连接了两种类型的服务
- 简单回显服务
- 在回显之前休眠 5 秒的服务
如果我为代理使用共享 HttpClient
并且我连接到一个简单的回显服务,我没有大的延迟问题,它的中值不到一秒,但是如果我连接到一个休眠服务随着时间和负载的增加,延迟会变高
如果我直接访问该服务,我会得到平均 5100 毫秒的预期延迟
现在,如果我改为为每个请求创建一个新的 HttpClient,它能够提供大约 5110 毫秒的良好延迟。但是,如果我用它来击中 echo 版本,它就会中断,并且 artillery 应用程序会给我一个 EADDRINUSE 错误(这很奇怪,因为它通常在 listen
一侧)
我使用的是 HTTP 而不是 HTTP/2,因为服务不在 SSL 上,所以我没有尝试过单连接多路复用
我还为代理使用保守的 64MB 堆大小。
创建一个新的 HttpClient
是否更合适,也许失败的原因是因为我只是在一台不合适的机器上测试可笑的负载?
为了解决这个问题,我必须在客户端尝试获得响应时应用 back-pressure pattern
final HttpClientRequest clientRequest = httpClient
.request(contextRequest.method(), clientRequestOptions, clientResponse -> {
contextRequest.response().setChunked(clientResponse.getHeader(HttpHeaders.CONTENT_LENGTH) == null)
.setStatusCode(clientResponse.statusCode());
clientResponse.headers().forEach(e -> contextRequest.response().putHeader(e.getKey(), e.getValue()));
clientResponse.endHandler(v -> {
contextRequest.response().end();
});
// back pressure here
Pump.pump(clientResponse, contextRequest.response()).start();
}).exceptionHandler(context::fail)