I've got Apache client 5.4.3 working with a custom connection operator
that implements UDS support. I want to upstream this as a proper
feature, since it's significantly more efficient than localhost. I
want to discuss the design of this feature a bit; since it's a non-TCP
transport layer, we have to be careful about how it's integrated into
the overall design of the client.

CONVENTION

There are a couple of ways clients expose UDS support. One is to use a
URI scheme like unix or http+unix and provide the path to the socket
as the URI authority:

http+unix://%2Fpath%2Fto%2Fsocket/socket.sock/path?query

This is a slight abuse of notation since Unix sockets are a transport,
rather than an application-level concern; additionally, neither scheme
has no IANA registration.

Another solution is to provide the UDS path out-of-band, as in this
example from curl's man page:

curl --unix-socket socket-path https://example.com

This is cleaner since it gives us a principled way to derive the Host
header (typically localhost) and doesn't stuff transport details into
the URI. It's also easier for end users to convert an existing
localhost call to UDS. I think this is my preferred approach. The main
question is which of the many config types should expose this option.
RequestConfig seems reasonable, but there's also ConnectionConfig and
SocketConfig.

IMPLEMENTATION

There are two options here: the JDK16 standard library, and
JUnixSocket. I think we should do basically what we did for ALPN
before JDK 1.8 Maintenance Release 3: model JUnixSocket as an optional
dependency, use reflection to check for both implementations, and fail
if neither one can be found. For JDK16 support we have the option of
vending a multi-release jar, but this would add significant build-time
complexity with little clear benefit over a MethodHandle set in a
static initializer (this approach has equivalent performance to static
linkage, for example).

ASYNC

According to my research, JDK16 and JUnixSocket both support
non-blocking IO through the usual NIO abstractions like SocketChannel
and Selector.

SOCKET TYPES

There are two types of Unix domain sockets. AF_UNIX is supported
pretty much everywhere (even Windows) and is accessed as a file on the
filesystem. Linux additionally offers abstract Unix domain sockets,
which are accessed through a special namespace. Only AF_UNIX is
supported by JDK16, so this feature would require JUnixSocket. I
recommend only supporting AF_UNIX for the time being, since I'm not
aware of any other HttpComponents features that are non-portable (such
as epoll support).

INTERACTIONS

UDS support would need to work correctly with connection pooling,
route modeling, and existing features like proxy support.
Additionally, any code that assumes that the remote address is an
InetAddress or InetSocketAddress may need to be adjusted. Finally,
features like request logging and debug logging may need to account
for the possibility of a UDS connection.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to