ElasticSearch Nest BulkВсе остановлено после получения сбоев, которые нельзя повторить из _bulk - PullRequest
0 голосов
/ 24 января 2019

Используя BulkAll() для массовой вставки, я получаю эту странную ошибку

BulkAll halted after receiving failures that can not be retried from _bulk

Однако я все еще получаю успешный ответ, когда изучаю исключение:

Successful low level call on POST: /cf-lblogs-2019.01.23/cloudflareloadbalancinglogelasticentity/_bulk?

Что я здесь не так делаю? Ниже приведен фрагмент кода:

var waitHandle = new CountdownEvent(1);

var bulk = _client.BulkAll(group.ToList(), a => a
                .Index(_index.Replace("*", string.Empty) + group.Key)
                .BackOffRetries(2)
                .BackOffTime("30s")
                .RefreshOnCompleted(true)
                .MaxDegreeOfParallelism(4)
                .Size(group.Count()));

bulk.Subscribe(new BulkAllObserver(
                onNext: response => _logger.LogInformation($"Indexed {response.Page * group.Count()} with {response.Retries} retries"),
                onError: HandleInsertError,
                onCompleted: () => waitHandle.Signal()
            ));

waitHandle.Wait();


private void HandleInsertError(Exception e)
    {
        var exceptionString = e.ToString(); 
        _logger.LogError(exceptionString);
    }

Гнездо 6.4.2.

Эластичный 6.5.4.

1 Ответ

0 голосов
/ 25 января 2019

Это означает, что наблюдаемая BulkAll не может проиндексировать один или несколько документов, которые были отклонены по причине, которую нельзя повторить.

По умолчанию предикат повторения для документов, которые не могут быть проиндексированы, - это когда код состояния ответа HTTP 429 возвращается для элемента, то есть при попытке одновременно индексировать больше документов, чем может обработать кластер.

Две вещи выскакивают, глядя на настройку BulkAll():

  1. var bulk = _client.BulkAll(group.ToList(), a => a

    group.ToList() немедленно оценит всех документов и сохранит их в памяти List<T> в памяти. Для эффективности вы обычно хотите лениво перечислять большую коллекцию при массовом индексировании. Если group - это IEnumerable<T>, который может быть передан BulkAll, просто передайте его.

  2. .Size(group.Count()));

    Это попытается отправить все документы в одном массовом запросе. Идея с BulkAll заключается в том, что он будет отправлять несколько массовых запросов одновременно, и продолжайте делать это, пока все документы не будут проиндексированы.

    Размер должен быть установлен на разумный размер для каждого запроса; Вы можете рассчитать разумный размер в байтах, рассчитав среднее количество байтов в документе, а затем начать с менее чем 5 МБ или начать с 1000 документов на запрос и оценить, достаточна ли скорость индексации для ваших нужд. или если вы начнете получать 429 ответов. Когда последнее начинает происходить, это хороший признак того, что вы приближаетесь к порогу предела индексации для кластера для документов, которые вы индексируете.

...