我正在尝试使用类似于https://github.com/vert-x/vertx-examples/blob/master/src/raw/java/proxy/ProxyServer.java但与路由器类似的Vertx和Vertx客户端实现代理。
例外情况是它连接到多个服务器而不是单个服务器。
我有两种类型的服务连接到
如果我使用共享HttpClient
作为代理,并且我连接到简单的echo服务,我没有很大的延迟问题,它的中位数不到一秒,但如果我连接到睡眠服务延迟随着时间和负载的增加而增加
如果我直接点击服务,我会得到预期的延迟,平均为5100毫秒
现在,如果我更改为每个请求创建一个新的HttpClient,它可以提供大约5110ms的良好延迟。但是,如果我使用它来击中回声版本它会中断并且炮兵应用程序会给我一个EADDRINUSE错误(这很奇怪,因为它通常在listen
侧)
我使用HTTP而非HTTP / 2,因为服务不在SSL上,所以我没有尝试过单一连接多路复用
我还使用保守的64MB堆大小代理。
创建一个新的HttpClient
是否更合适,也许失败的原因是因为我只是在一台不合适的机器上测试荒谬的负载?
答案 0 :(得分:0)
要解决此问题,我必须在客户端尝试获取响应时应用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)