'Does GRPC ManagedChannel use DNS-RR for load balancing?

When creating a channel like this

ManagedChannelBuilder.forAddress("mybackend", 6565)

And mybackend is a DNS A record with multiple IP addresses.

Does GRPC round-robin between the records or does it just stick to one for the lifetime of the channel?

If not, would it work if I do?

ManagedChannelBuilder.forTarget("dns:///mybackend:6565")

Or is this capability just not available?



Solution 1:[1]

NettyChannelBuilder.forAddress(SocketAddress) is the API that can only access a single IP, due to InetSocketAddress's eager resolution.

forAddress(String, int) was retrofit to use forTarget(String) internally. So it is a convenience and converts to something similar to forTarget(host + ":" + port), but with some extra logic to handle IPv6 literals. The "dns:///" prefix is added to target strings when they fail to parse. See the forTarget() docs for both details. So it is essentially equivalent to using forTarget("dns:///mybackend:6565").

gRPC, by default, doesn't round-robin over multiple addresses. By default it does "pick-first" which stops on the first working address (potentially choosing a different address when reconnecting). You can change that via a service config or defaultLoadBalancingPolicy("round_robin").

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Eric Anderson