A solução canônica para isso é não confiar no endereço IP do usuário final, mas usar um balanceador de carga da Camada 7 (HTTP / HTTPS) com "Sticky Sessions" por meio de um cookie.
Sessões aderentes significa que o balanceador de carga sempre direcionará um determinado cliente para o mesmo servidor de back-end. Via cookie significa que o balanceador de carga (que é um dispositivo HTTP totalmente capaz) insere um cookie (que o balanceador de carga cria e gerencia automaticamente) para lembrar qual servidor de backend deve usar uma determinada conexão HTTP.
A principal desvantagem das sessões é que a carga do servidor beckend pode se tornar um pouco desigual. O balanceador de carga só pode distribuir a carga de maneira justa quando novas conexões são feitas, mas, considerando que as conexões existentes podem durar muito em seu cenário, então, em alguns períodos de tempo, a carga não será distribuída totalmente de maneira justa.
Quase todos os balanceadores de carga da Camada 7 devem ser capazes de fazer isso. No Unix / Linux, alguns exemplos comuns são nginx, HAProxy, Apsis Pound, Apache 2.2 com mod_proxy e muitos mais. No Windows 2008+, há o Microsoft Application Request Routing. Como aparelhos, Coyote Point, loadbalancer.org, Kemp e Barracuda são comuns no espaço low-end; e F5, Citrix NetScaler e outros em high-end.
Willy Tarreau, autor de HAProxy, tem uma bela visão geral das técnicas de balanceamento de carga aqui .
Sobre o round robin do DNS:
Our intent was for the Round Robin DNS TTL value for our api.company.com (which we've set at 1 hour) to be honored by the downstream caching nameservers, OS caching layers, and client application layers.
Não será . E O DNS Round Robin não é um bom ajuste para balanceamento de carga . E se nada mais te convence, tenha em mente que clientes modernos podem preferir um host sobre todos os outros devido à maior correspondência de prefixo , então se o cliente móvel alterar o endereço IP, ele pode optar por mudar para outro host RR.
Basicamente, não há problema em usar o round robin de DNS como uma distribuição de carga grosseira, apontando 2 ou mais registros RR para endereços IP altamente disponíveis, manipulados por balanceadores de carga reais em HA ativo / passivo ou ativo / ativo. E se isso é o que você está fazendo, então você também deve servir esses registros RR de DNS com valores de Time To Live longos, já que os endereços IP associados já estão altamente disponíveis.