Skip to content

HttpClient prefers IP (from DNS) from the same network as host #27734

Closed
@Elufimov

Description

@Elufimov

Env:
Consul server of 3 master nodes with dns enable. 4 servers registered by one name, 172.18.2.20,172.18.2.21,10.50.0.72,10.50.0.73. Ip of host server is 172.18.1.250. Consul by default has 0 ttl on dns query and shuffle ips.

dig searchcases.service.caravan.consul

; <<>> DiG 9.10.3-P4-Ubuntu <<>> searchcases.service.caravan.consul
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23101
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;searchcases.service.caravan.consul. IN	A

;; ANSWER SECTION:
searchcases.service.caravan.consul. 0 IN A	172.18.2.20
searchcases.service.caravan.consul. 0 IN A	10.50.0.73
searchcases.service.caravan.consul. 0 IN A	10.50.0.72
searchcases.service.caravan.consul. 0 IN A	172.18.2.21

;; ADDITIONAL SECTION:
searchcases.service.caravan.consul. 0 IN TXT	"consul-network-segment="
searchcases.service.caravan.consul. 0 IN TXT	"consul-network-segment="
searchcases.service.caravan.consul. 0 IN TXT	"consul-network-segment="
searchcases.service.caravan.consul. 0 IN TXT	"consul-network-segment="

;; Query time: 1 msec
;; SERVER: 172.16.0.79#53(172.16.0.79)
;; WHEN: Thu Oct 25 07:02:47 UTC 2018
;; MSG SIZE  rcvd: 271

dig searchcases.service.caravan.consul

; <<>> DiG 9.10.3-P4-Ubuntu <<>> searchcases.service.caravan.consul
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35746
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;searchcases.service.caravan.consul. IN	A

;; ANSWER SECTION:
searchcases.service.caravan.consul. 0 IN A	172.18.2.21
searchcases.service.caravan.consul. 0 IN A	10.50.0.73
searchcases.service.caravan.consul. 0 IN A	10.50.0.72
searchcases.service.caravan.consul. 0 IN A	172.18.2.20

;; ADDITIONAL SECTION:
searchcases.service.caravan.consul. 0 IN TXT	"consul-network-segment="
searchcases.service.caravan.consul. 0 IN TXT	"consul-network-segment="
searchcases.service.caravan.consul. 0 IN TXT	"consul-network-segment="
searchcases.service.caravan.consul. 0 IN TXT	"consul-network-segment="

;; Query time: 1 msec
;; SERVER: 172.16.0.79#53(172.16.0.79)
;; WHEN: Thu Oct 25 07:02:47 UTC 2018
;; MSG SIZE  rcvd: 271

As one can see consul return ips in random order for each query.
The test code looks like:

             var host = new HostBuilder()
                .ConfigureServices((context, collection) =>
                {
                    collection
                        .AddHttpClient("1")
                        .SetHandlerLifetime(TimeSpan.FromSeconds(5))
                        .ConfigurePrimaryHttpMessageHandler(builder =>
                            new SocketsHttpHandler
                            {
                                PooledConnectionLifetime = TimeSpan.FromSeconds(5)                             
                            }
                        );
                })
                .Build();
            var _httpClients = host.Services.GetService<IHttpClientFactory>().CreateClient("1");
            while (true)
            {
               var response = _httpClients.GetAsync(args[0]).GetAwaiter().GetResult();
            }

From the start requests split almost equally on 172.18.2.20,172.18.2.21 and nothing goes to 10.50.0.72,10.50.0.73. HttpClient send request to 10.50.0.72,10.50.0.73 only if 172.18.2.20,172.18.2.21 were removed from consul. And if we reintroduce even one of 172.18.2.20,172.18.2.21 in consul it makes all request go to 172.18.2.20 or 172.18.2.21.

dotnet --version
2.1.400
Application was published with self contained for ubuntu-x64 runtime and was launched on Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-103-generic x86_64)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions