Closed
Description
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)