Как правильно управлять тайм-аутом Elastic Java Rest Client

Мы используем эластичный java rest high client 6.1, но часто и случайным образом остальные клиенты возвращают тайм-аут.

Мы уже настраиваем тайм-аут следующим образом:

        client.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback {
        override def customizeRequestConfig(requestConfigBuilder: RequestConfig.Builder): RequestConfig.Builder = {
            requestConfigBuilder
                .setConnectionRequestTimeout(0)
                .setConnectTimeout(parameters.getInt(s"$propertyGroup.timeout.connection"))
                .setSocketTimeout(parameters.getInt(s"$propertyGroup.timeout.socket"))
        }
    }).setMaxRetryTimeoutMillis(parameters.getInt(s"$propertyGroup.timeout.socket"))
        .setFailureListener(new RestClient.FailureListener {
            override def onFailure(host: HttpHost): Unit = {
                val a = 0
            }
        })

И во время нашего теста мы установили порог тайм-аута в 60000 мс, 100000 мс, 180000 мс; и все равно случайно получить исключение тайм-аута.

Эта проблема возникает только тогда, когда мы запускаем задание FLINK, которое выполняется так быстро, как может выполнять множество параллельных запросов, или когда мы запрашиваем эластичный элемент в ForEach с миллиардами итераций.

Есть стратегия, идея, фрагмент кода, конфигурация, передовой опыт и т. Д., Чтобы: Подождать несколько секунд (или миллисекунд) и снова попытаться выполнить неудавшийся запрос?


person Michael Sogos    schedule 16.01.2018    source источник
comment
Я полагаю, что под queries вы на самом деле имеете в виду поисковые запросы, а не другие операции, такие как массовые? Пока вы выполняете это задание, посмотрите очереди задач для ES и убедитесь, что вы не делаете DoS-атаки на свой кластер.   -  person ryanlutgen    schedule 17.01.2018
comment
Вы правы, я имею в виду ПОИСКОВЫЕ запросы.   -  person Michael Sogos    schedule 17.01.2018
comment
Вы правы, я имею в виду ПОИСКОВЫЕ запросы. В моем случае на каждой итерации у меня есть строка, которую я использую для применения TERM FILTER и для получения агрегации MATRIX_STAT из ES. Итак, вероятно, я слишком сильно напрягаю ES db, потому что я отправляю к нему много запросов, мы знаем это, и это ожидается, но как мне повторно выполнить тот же запрос, если он истекает? Я полагаю, что тайм-аут наступает не потому, что запрос занимает слишком много времени (он отвечает за очень мало миллисекунд на один запрос), а потому, что очередь задач ES заполнена, и следующие запросы достигают тайм-аута из-за ожидания обработки ES.   -  person Michael Sogos    schedule 17.01.2018


Ответы (1)


Для тех, у кого такая же проблема ...

По моему тесту кажется, что тайм-аута можно избежать, просто добавив больше оперативной памяти.

Конечно, это зависит от причины тайм-аута; пока я разбирался в своей проблеме, я обнаружил три возможные причины:

  1. таймаут запроса: существует ошибка, о которой сообщается, о java http-клиенте, предлагается установить в 0 тайм-аут соединения запроса (см. мой код выше)
  2. много одновременных запросов: если ваше приложение выполняет много одновременных запросов, то, возможно, эластичный узел начинает ставить в очередь запросы, вызывая нежелательный тайм-аут. Это была моя проблема, чтобы решить, я изменяю конфигурацию JVM о переносе памяти кучи с 8 ГБ до 20 ГБ и изменении размера узла данных с 32 ГБ до 64 ГБ, также я получаю повышение производительности, добавляя клиентский узел и настраивая балансировщик нагрузки между двумя клиентскими узлами, и снова Я получаю больше производительности при переходе с диска 10k на ssd с интенсивным чтением.
  3. тайм-аут запроса: иногда просто запрос неэффективен и может иметь тайм-аут, я предлагаю упростить запрос, добавив поле, которое содержит значение, представляющее комбинацию более сложного условия фильтрации, поэтому вместо выполнения сложного запроса вы можете запросить только одно индексированное поле
person Michael Sogos    schedule 27.01.2018
comment
Где сообщается об этой ошибке? - person Oliver Charlesworth; 28.03.2018
comment
Я должен искать еще раз, потому что я нашел его на эластичном форуме, на случай, если я добавлю сюда ссылку. - person Michael Sogos; 29.03.2018
comment
@OliverCharlesworth Я обнаружил здесь проблему connectionTimeout = 0: github.com/elastic/elasticsearch/issues / 24069 - person Danilo Akamine; 29.05.2019