Netty Http 客户端连接池
Netty Http Client Connection Pool
我正在尝试了解 netty http 客户端连接池。
如果是NIO和异步,那么这个连接池有什么意义呢?
例如:如果服务A调用服务B并且服务A将客户端连接池计数设置为50,那么是否执行意味着我们最多只能发出 50 个并行请求?
更新:
// remote server
@GetMapping("echo")
public Mono<String> echo(){
return Mono.just("echo")
.delayElement(Duration.ofSeconds(3));
}
// client 1 conneciton
HttpClient httpClient = HttpClient.create(ConnectionProvider.newConnection());
WebClient client = WebClient.builder()
.baseUrl("http://localhost:8080/echo")
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
// run
var start = System.currentTimeMillis();
Flux.range(1, 50)
.flatMap(i -> client.get().retrieve().bodyToMono(String.class))
.collectList()
.doOnNext(System.out::println)
.doFinally(s -> System.out.println("Total Time Taken : " + (System.currentTimeMillis() - start) + " ms"))
.block();
我在 3.5 秒内完成所有呼叫。理想情况下有 1 个连接,我应该在 150 秒内完成它们。
连接池是维护的连接缓存,以便在需要对远程服务(数据库、微服务等)的未来请求时重新使用连接。连接池用于增强性能...请参阅 Connection pool。它不取决于您选择的传输方式:NIO、epoll、kqueue 等。
当你有一个连接池时,对于每个连接,你只需执行一次 DNS 解析、连接建立等,然后你可以为许多请求重用这个连接。
then what is the significance of this connection pool?
当你没有连接池时,每次你想向远程服务发出请求时,都会进行 DNS 解析、连接建立等。
连接池仅包含到给定远程服务的连接。因此,当您拥有服务 A 和服务 B 时,您将拥有服务 A 的连接池和服务 B 的连接池(如果这些是不同的远程地址,Reactor Netty 不提供每个 URI 的配置)。
在 Reactor Netty 中,您可以选择将连接池配置为具有相同的配置,或者您可以为每个池配置不同的配置(取决于您的用例)。
在 Reactor Netty 中,您可以配置 max connection
,这意味着对于给定的服务,您可以发出最大数量的并行请求(打开的连接)。其他请求将保留在队列中,一旦连接可用于重用,就可以执行挂起的请求。
如上所述,连接池的所有可用配置都可以在Reference Documentation
中找到
我正在尝试了解 netty http 客户端连接池。 如果是NIO和异步,那么这个连接池有什么意义呢?
例如:如果服务A调用服务B并且服务A将客户端连接池计数设置为50,那么是否执行意味着我们最多只能发出 50 个并行请求?
更新:
// remote server
@GetMapping("echo")
public Mono<String> echo(){
return Mono.just("echo")
.delayElement(Duration.ofSeconds(3));
}
// client 1 conneciton
HttpClient httpClient = HttpClient.create(ConnectionProvider.newConnection());
WebClient client = WebClient.builder()
.baseUrl("http://localhost:8080/echo")
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
// run
var start = System.currentTimeMillis();
Flux.range(1, 50)
.flatMap(i -> client.get().retrieve().bodyToMono(String.class))
.collectList()
.doOnNext(System.out::println)
.doFinally(s -> System.out.println("Total Time Taken : " + (System.currentTimeMillis() - start) + " ms"))
.block();
我在 3.5 秒内完成所有呼叫。理想情况下有 1 个连接,我应该在 150 秒内完成它们。
连接池是维护的连接缓存,以便在需要对远程服务(数据库、微服务等)的未来请求时重新使用连接。连接池用于增强性能...请参阅 Connection pool。它不取决于您选择的传输方式:NIO、epoll、kqueue 等。 当你有一个连接池时,对于每个连接,你只需执行一次 DNS 解析、连接建立等,然后你可以为许多请求重用这个连接。
then what is the significance of this connection pool?
当你没有连接池时,每次你想向远程服务发出请求时,都会进行 DNS 解析、连接建立等。
连接池仅包含到给定远程服务的连接。因此,当您拥有服务 A 和服务 B 时,您将拥有服务 A 的连接池和服务 B 的连接池(如果这些是不同的远程地址,Reactor Netty 不提供每个 URI 的配置)。
在 Reactor Netty 中,您可以选择将连接池配置为具有相同的配置,或者您可以为每个池配置不同的配置(取决于您的用例)。
在 Reactor Netty 中,您可以配置 max connection
,这意味着对于给定的服务,您可以发出最大数量的并行请求(打开的连接)。其他请求将保留在队列中,一旦连接可用于重用,就可以执行挂起的请求。
如上所述,连接池的所有可用配置都可以在Reference Documentation
中找到