отключение Java кеша DNS - PullRequest
0 голосов
/ 13 марта 2019

Я использую Java 8 (OpenJDK). Похоже, что лучший способ отключить кэш DNS в Java - установить networkaddress.cache.ttl=0 в $JAVA_HOME/jre/lib/security/java.security.

Я пробовал это, но, похоже, это не имеет никакого значения, независимо от того, какое значение я там указывал, записи DNS кэшируются в течение ~ 5 секунд. Я знаю, что значение установлено правильно, потому что я проверяю его с помощью java.security.Security.getProperty("networkaddress.cache.ttl").

Я тестирую Java-кеш с HttpURLConnection клиентом и сравниваю его с необработанным curl клиентом, curl вообще не кешируется. Мой сервер является балансировщиком нагрузки, который возвращает один из 3 разных ips для каждого запроса в циклическом переборе. Каждый из этих ips размещает веб-сервис, который возвращает имя хоста, на котором он работает.

Вот так выглядит мой java-клиент:

    public static void main(String[] args) throws Exception {
        System.out.println("networkaddress.cache.ttl=" + java.security.Security.getProperty("networkaddress.cache.ttl"));
        Thread.sleep(1000);
        printServerHost();
        Thread.sleep(2000);
        printServerHost();
        Thread.sleep(4000);
        printServerHost();
        Thread.sleep(6000);
        printServerHost();
        Thread.sleep(11000);
        printServerHost();
    }

    public static void printServerHost() throws Exception{
        URL url = new URL("http://server/");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("Content-Type", "application/json");
        con.setRequestProperty("Cache-Control", "no-cache");
        con.setRequestProperty("accept", "application/json");

        BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String response = reader.readLine();
        reader.close();
        con.disconnect();

        System.out.println(response);
    }

Какие выходы:

networkaddress.cache.ttl=0
ip-172-31-12-68.ec2.internal
ip-172-31-12-68.ec2.internal
ip-172-31-12-68.ec2.internal
ip-172-31-41-56.ec2.internal
ip-172-31-16-34.ec2.internal

А вот так выглядит мой клиент curl:

curl server
sleep 2s
curl server
sleep 4s
curl server
sleep 6s
curl server
sleep 11s
curl server

Какие выходы:

ip-172-31-41-56.ec2.internal
ip-172-31-16-34.ec2.internal
ip-172-31-12-68.ec2.internal
ip-172-31-41-56.ec2.internal
ip-172-31-16-34.ec2.internal

Что мне не хватает? Должен ли я также что-то настроить в HttpURLConnection? Еще один конфиг JVM? Может это другой кеш, а не днс, пул соединений или пул сокетов?

1 Ответ

0 голосов
/ 15 марта 2019

Проблема была в другом кеше, не связанном с DNS, возможно, в соединении или сокете, так как при использовании ForkJoinPool отображаются разные хосты:

ForkJoinPool forkJoinPool = new ForkJoinPool(3);        
forkJoinPool.submit(() -> IntStream.range(0, 10).parallel().forEach(i -> printServerHost())).get();
...