reactphp / socket

Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP.
https://reactphp.org/socket/
MIT License
1.21k stars 157 forks source link

Use round robin for happy eyeballs DNS responses (load balancing) #247

Closed clue closed 4 years ago

clue commented 4 years ago

The happy eyeballs algorithms tries to connect over both IPv6 and IPv4 at the same time. Accordingly, the hostname has to be resolved for both address families which both may potentially contain any number of records (load balancing).

This changeset randomizes the order of returned IP addresses per address family. This means that if multiple records are returned, it will try to connect to a random one from this list instead of always trying the first. This allows the load to be distributed more evenly across all returned IP addresses. This can be used as a very basic DNS load balancing mechanism.

This is similar to what the old DnsConnector did (it always tried one random IP from the list of IPs). See also https://daniel.haxx.se/blog/2012/01/03/getaddrinfo-with-round-robin-dns-and-happy-eyeballs/ for some background information.