If I understand the scenario here correctly, each client has many different server names, and those server names change over time. What determines this list of server names for a given client to use, and how does the client get the list of server names to use? Can you just publish all of the addresses under a single server name via your name service (whether it be DNS or zookeeper or whatever)? That would probably be the easiest way to deal with this, because then you could just have a single channel with a single name, and you'd automatically get a separate subchannel for every address, which you could use with the round_robin LB policy.
If for some reason you can't do that, then architecturally, you would need to create a custom resolver that would get the list of names to resolve, resolve each one, and return the combined list of addresses to the channel. But I'd recommend against this approach, for the following reasons:
- It's a much hackier solution than simply providing the addresses under one name in your name service. This is exactly the problem that a name service was designed to solve, so trying to solve it in a different way seems very odd to me.
- C-core does not currently provide a public API for implementing resolvers in wrapped languages like C#; this is something that we want to do, but it hasn't bubbled up to the top of our priority list. You could probably do it by writing some code against our internal C++ API, but that API is not supported for external use and may change from version to version, so it's not a great option right now.
I don't think there's any reason to need a custom LB policy for this scenario. But even if there was, C-core does not provide a public API for implementing LB policies in wrapped languages. And unlike resolvers, this is probably not an API that we will ever provide, because the LB policy is in the performance-critical path, and hopping out of core and into the wrapped language from the LB policy would kill performance.
I hope this information is helpful.