Skip to content

Connection Reuse

Stephen M. Coakley edited this page Aug 5, 2021 · 6 revisions

By default, Isahc makes use of a feature called connection reuse to improve performance and throughput for subsequent HTTP requests to the same host. After HTTP requests are completed, if the underlying connection is reusable, it is added to the connection cache to be reused to reduce latency for future requests. Requests for the same host will use an open connection from the cache if one is available.

Closing connections early

If a response stream is dropped before it has been completely read from, then that HTTP connection will be terminated. For HTTP/1.1 this requires closing the socket connection entirely since there's no way in HTTP/1.1 to ask the server to stop sending the response body once it has already started doing so. This means that we can't put such connections in the connection cache and we lose connection reuse.

If you are downloading a file on behalf of a user and have been requested to cancel the operation, then this is probably OK behavior. But if you are making many small API calls to a known server, then you may want to call consume instead of dropping a response not fully read. This method will read any remaining data from the response stream and immediately discard it, and makes sure the connection can be reused for future requests. In most situations, reading a couple megabytes off a socket is usually more efficient in the long run than taking a hit on connection reuse, and opening new TCP connections can be expensive.

Since not reading the entirety of an HTTP response can reduce performance and can be indicative of a mistake by the programmer, Isahc will emit a log message when this happens that looks like this:

response dropped without fully consuming the response body, which may result in sub-optimal performance

In HTTP/2 and newer there is a mechanism to signal the server to stop sending its response, so there is no reuse penalty for terminating a response stream early.

Configuring

You can customize how the connection cache behaves when creating a custom client instance using HttpClientBuilder. The relevant builder methods are:

If you don't want connection reuse, you can disable the connection cache entirely by calling connection_cache_size(0) on your client builder.

Under the hood

The connection cache is provided by libcurl. Isahc does little to change how connection reuse works in libcurl, aside from making it easy to customize its behavior, because it already works great!

Clone this wiki locally