Почему поиск Azure выдает исключение IndexBatchException без сбоев в IndexingResults

В моем микросервисе (отвечающем за подачу данных в экземпляр поиска Azure на основе сообщений о событиях) я пытаюсь выполнить MergeOrUpload IndexBatch. Размер пакета всегда равен 1, поскольку одно сообщение о событии содержит только один объект, который мне нужно объединить или загрузить в поиск.

Я постоянно получаю IndexBatchException, который не содержит IndexingResults, где Succeeded имеет значение false.

Подробная информация о службе поиска Azure

  • Уровень: стандартный
  • Разделы и реплики: 3 и 3

Детали микросервиса

  • Версия Asp .Net Core: 2.2
  • Версия Microsoft.Azure.Search SDK: 9.0.1

В настоящее время мой код настроен для обработки IndexBatchException путем повторной постановки сообщения в очередь на служебной шине с доставкой по расписанию в будущем ~ 5 секунд. После получения этого сообщения, помещенного в очередь, мой код отклоняет обработку этого сообщения о событии, поскольку обнаруживает, что дата сообщения не позже, чем данные в поисковом экземпляре.

Я понимаю, что могу изменить обработку исключений, чтобы повторить попытку только в том случае, если есть IndexingResults с ошибкой, но я хотел бы понять настоящую причину IndexBatchException, которая не содержит IndexingResults, где Succeeded имеет значение false, а также то, что сообщество предлагает сделать. < / сильный>. Обратите внимание, что сама операция прошла успешно, так как данные загружаются каждый раз при первой попытке.

Я также могу подтвердить, что экземпляр поиска Azure не загружен и не превысил свои ограничения.

Образец кода

/// <inheritdoc />
public async Task ProcessDocument(DomainEvent<TMessage> domainEvent)
{
    Guard.IsNotNull(domainEvent, nameof(domainEvent));

    var searchIndexClient = await searchIndexClientFactory.CreateAsync(
        domainEvent.TenantId,
        IndexName);

    var storedDocument = await GetDocument(
            searchIndexClient,
            domainEvent);

    if (storedDocument != null && ValidateEventDate(domainEvent, storedDocument))
    {
        logger.LogWarning($"Received event but detected that more recent updates have already been applied. Incoming Event Details: {JsonConvert.SerializeObject(domainEvent)}");
        return;
    }

    var newDocument = mapper.Map<TDocumentIndex>(domainEvent.Resource);

    SetSomeProperties(domainEvent, newDocument); // Changed method name. It basically is adding some contextual prop's to doc

    try
    {
        var documents = new TDocumentIndex[] { newDocument };

        var batch = IndexBatch.MergeOrUpload(documents);

        var result = await searchIndexClient
            .Documents
            .IndexAsync(batch);

        var operationResult = result
            .Results
            .FirstOrDefault();

        if (operationResult == null || operationResult.Succeeded == false)
        {
            logger.LogError($"There was an error when merging or uploading a document for tenant {domainEvent.TenantId}. Error message {operationResult?.ErrorMessage}, Message body {JsonConvert.SerializeObject(domainEvent)}");
        }
    }
    catch (IndexBatchException indexBatchException)
    {
        logger.LogError($"Failed to index some of the documents: {0}", string.Join(", ", indexBatchException.IndexingResults.Where(r => !r.Succeeded).Select(r => $"{r.Key}:{r.ErrorMessage}")));
        throw;
    }
}

Образец журнала ошибок

  • Не удалось проиндексировать некоторые документы: 0 Вышеуказанное создается следующей строкой кода
catch (IndexBatchException indexBatchException)
    {
        logger.LogError($"Failed to index some of the documents: {0}", string.Join(", ", indexBatchException.IndexingResults.Where(r => !r.Succeeded).Select(r => $"{r.Key}:{r.ErrorMessage}")));
        throw;
    }

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


person Ramandeep Arora    schedule 31.07.2019    source источник


Ответы (1)


Служба возвращает IndexingResults, как и ожидалось, но в вашем коде есть небольшая ошибка. Подсказка об ошибке заключается в «0», который возвращается в «Не удалось проиндексировать некоторые документы: 0». Если бы код функционировал должным образом, это была бы пустая строка. Вам необходимо удалить $ в строке, которая оценивает {0} как выражение C #, а не как токен форматирования строки.

Его следует читать:

logger.LogError("Failed to index some of the documents: {0}", string.Join(", ", indexBatchException.IndexingResults.Where(r => !r.Succeeded).Select(r => $"{r.Key}:{r.ErrorMessage}")));
person Corom - MSFT    schedule 07.08.2019
comment
Спасибо Corom за ваш отзыв. После исправления журнала мы поняли, что это ошибка 409 Conflict, которую выдает служба поиска после 1 попытки слияния, которая не удалась из-за элементов управления параллелизмом. Повторная попытка прошла успешно, документы добавлены в поиск, как и ожидалось. - person Ramandeep Arora; 09.08.2019