В моем микросервисе (отвечающем за подачу данных в экземпляр поиска 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;
}
Я ожидаю, что произойдет только исключение пакета индекса, когда поиск находится под нагрузкой, и даже если это так, я ожидаю, что это исключение выдаст это исключение с некоторыми неудачными результатами.