On 2025/04/21 17:40:01 Ryan Schmitt wrote:
> 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.

Well-known issue: https://github.com/whatwg/url/issues/577
see also: https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass

I prefer JUnixSocket since it works everywhere and has been around for years 
AND I prefer the path to the socket be out of band to avoid confusing and 
interpretation.

Do you have competitive numbers how the speed up looks for you?

M

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

Reply via email to