Rest High Level Client: Тайм-аут запроса не работает

Мы пытаемся использовать тайм-аут запроса в наших запросах, но, похоже, у нас это не работает.

Вот что мы сделали в рамках настройки:

  • search.default_allow_partial_results: false (как на стороне сервера, так и на стороне клиента)
  • Установите время ожидания 10 мс для каждого поискового запроса, который мы выполняем. (сторона клиента)
  • Помимо этого, у нас установлены глобальные тайм-ауты, как показано в приведенном ниже коде:
RestHighLevelClient client = new 
RestHighLevelClient(RestClient.builder(httpHost).setRequestConfigCallback(
    requestConfigBuilder -> requestConfigBuilder
    .setConnectTimeout(30000)
    .setConnectionRequestTimeout(90000)
    .setSocketTimeout(90000)).setMaxRetryTimeoutMillis(90000));

Запросы занимают более 8 секунд, но время ожидания еще не истекло. Мы отключили частичные результаты, ожидая получения ошибки тайм-аута, но мы также не получаем никаких ошибок.

Кроме того, флаг isTimedOut всегда возвращается как false, даже если запрос занял больше указанного времени ожидания.

Вот образец запроса, который я запрашиваю:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    QueryBuilder infraQueryBuilder = QueryBuilders.termQuery("field1", field1);
    QueryBuilder totalCountRangeQueryBuilder = QueryBuilders.rangeQuery("field2").gte(3);

    BoolQueryBuilder innerBoolQueryBuilder = QueryBuilders.boolQuery();
    innerBoolQueryBuilder.must(QueryBuilders.rangeQuery("nestedDocType1.field1").gt(2));

    QueryBuilder filter = QueryBuilders
        .nestedQuery("nestedDocType1", innerBoolQueryBuilder, ScoreMode.Max)
        .innerHit(new InnerHitBuilder()
            .setFetchSourceContext(
                new FetchSourceContext(true, new String[]{"nestedDocType1.field1"}, null))
            .addSort(SortBuilders.fieldSort("nestedDocType1.field1").order(SortOrder.DESC))
            .setSize(1)
        );

    boolQueryBuilder.must(infraQueryBuilder);
    boolQueryBuilder.must(totalCountRangeQueryBuilder);

    if (inputRevisions != null && (inputRevisions.size() > 0)) {
      QueryBuilder allEligibleRevisionsFilter = QueryBuilders
          .termsQuery("field3", inputRevisions);
      boolQueryBuilder.must(allEligibleRevisionsFilter);
    }

    boolQueryBuilder.filter(filter);

    sourceBuilder.query(boolQueryBuilder)
        .fetchSource(new String[]{
            "field3",
            "field2"
        }, null);

    sourceBuilder.size(batchSize);
    sourceBuilder.timeout(TimeValue.timeValueMillis(10));

    SearchRequest searchRequest = createSearchRequest(sourceBuilder, enterpriseId);
    searchRequest.allowPartialSearchResults(false);

    SearchResponse searchResponse = getSearchResponse(searchRequest);

    ESCustomScroll<Set<String>> esCustomScroll = this::populateProcessedRevisionsSetWithESScroll;
    getESDataByScroll(esCustomScroll, searchResponse, processedRevisions);  // gets the data by scrolling over again and again until data is available.

Вот код, который мы используем для прокрутки:

private boolean populateProcessedRevisionsSetWithESScroll(SearchResponse searchResponse, Set<String> processedRevisions) {
            if(searchResponse == null ||
                searchResponse.getHits() == null ||
                searchResponse.getHits().getHits() == null ||
                searchResponse.getHits().getHits().length == 0) {
              return false;
            }

            for(SearchHit outerHit : searchResponse.getHits().getHits()) {
              Map<String, Object> outerSourceMap = outerHit.getSourceAsMap();

              String revision = (String) outerSourceMap.get("field4");
              int totalCount = (Integer) outerSourceMap.get("field3");

              SearchHit[] innerHits = outerHit.getInnerHits().get("nestedDocType1").getHits();

              if(innerHits == null || innerHits.length == 0) {
                logger.error("No inner hits found for revision: "+revision);
                continue;
              }

              Map<String, Object> innerSourceMap = innerHits[0].getSourceAsMap();
              int simCount = (Integer) innerSourceMap.get("field1");

              if(((totalCount - simCount) == 0) || (simCount > ((totalCount - simCount) / 2))) {
                processedRevisions.add(revision);
              }
            }

            return true;
          }

Даже в случае частичных результатов мы ожидаем, что будет установлен флаг isTimedOut. Но это не так.

Не могли бы вы рассказать нам, где мы ошибаемся или что нам не хватает?

Связанный вопрос: Java High Level Rest Client не освобождает соединение, хотя тайм-аут установлен

1 ответ

Попробуйте установить setMaxRetryTimeoutMillis за RestClientBuilder - он создаст слушателя и отключит его после setMaxRetryTimeoutMillis истекает.

Другие вопросы по тегам