Typically, load balancers like Amazon's Elastic Load Balancers use a DNS record set with multiple A records to provide multiple load balancer instances which can handle traffic to requesting endpoints:
$ dig +short my-fancy-elb.us-east-1.elb.amazonaws.com 10.0.1.1 10.0.1.2
If I attempt to curl this URL in verbose mode, I notice that
curl seems to round-robin attempts to the two IP addresses:
$ curl -ivs http://my-fancy-elb.us-east-1.elb.amazonaws.com | grep -i 'connected' * Connected to my-fancy-elb.us-east-1.elb.amazonaws.com (10.0.1.1) $ curl -ivs http://my-fancy-elb.us-east-1.elb.amazonaws.com | grep -i 'connected' * Connected to my-fancy-elb.us-east-1.elb.amazonaws.com (10.0.1.2)
Is the fact that
curl does round-robin on the A records described in the record set done by the
curl binary itself or is it something that the Linux kernel does for it?
TCP exists at layer 4 and DNS exists at layer 7, so I'd imagine that individual binaries and libraries would have to implement their own load-balancing and failover: fetching the DNS record set for the given domain name and choosing a TCP address to connect to from that set.
Can I reasonably expect that programming languages, browsers, and libraries like curl will do load-balancing and failover on A records for me?