Диагностика и устранение неполадок Azure Cosmos DB, приводящих к исключениям "Не найдено"

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Код состояния HTTP 404 означает, что ресурс больше не существует.

Ожидаемое поведение

Существует множество допустимых сценариев, в которых приложение ожидает код 404 и правильно обрабатывает сценарий.

Возвращено исключение "Не найдено" для элемента, который должен существовать или существует

Ниже приведены возможные причины, по которым необходимо возвращать код состояния 404, если элемент должен существовать или существует.

The read session is not available for the input session token (Сеанс чтения для входного маркера сеанса недоступен)

Решение:

  1. Обновите текущий пакет SDK до последней доступной версии. Наиболее распространенные причины этой ошибки исправлены в новых версиях пакета SDK.

Состояние гонки

Существует несколько экземпляров клиента SDK, и чтение произошло до записи.

Решение:

  1. По умолчанию для учетной записи Azure Cosmos DB используется модель согласованности сеансов. При создании или обновлении элемента ответ возвращает маркер сеанса, который можно передавать между экземплярами пакета SDK, чтобы гарантировать выполнение запросом чтения операции чтения из реплики с таким изменением.
  2. Измените уровень согласованности на более высокий.

Чтение пропускной способности для ресурса контейнера или базы данных

Использование PowerShell или Azure CLI и получение сообщения об ошибке Не найдено.

Решение:

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

Недопустимая комбинация ключа и идентификатора секции

Комбинация ключа и идентификатора секции не является допустимой.

Решение:

Исправьте логику приложения, которая вызывает неверную комбинацию.

Недопустимый символ в идентификаторе элемента

Элемент вставляется в Azure Cosmos DB с недопустимым символом в идентификаторе.

Решение:

Измените идентификатор на другое значение, которое не содержит специальных символов. Если изменить идентификатор нельзя, можно закодировать идентификатор с помощью Base64 для экранирования специальных символов. Base64 все равно может создать имя с недопустимым символом "/", который необходимо заменить.

Элементы, уже вставленные в контейнер для идентификатора, можно заменить значениями RID вместо ссылок на основе имен.

// Get a container reference that uses RID values.
ContainerProperties containerProperties = await this.Container.ReadContainerAsync();
string[] selfLinkSegments = containerProperties.SelfLink.Split('/');
string databaseRid = selfLinkSegments[1];
string containerRid = selfLinkSegments[3];
Container containerByRid = this.cosmosClient.GetContainer(databaseRid, containerRid);

// Invalid characters are listed here.
// https://learn.microsoft.com/dotnet/api/microsoft.azure.documents.resource.id#remarks
FeedIterator<JObject> invalidItemsIterator = this.Container.GetItemQueryIterator<JObject>(
    @"select * from t where CONTAINS(t.id, ""/"") or CONTAINS(t.id, ""#"") or CONTAINS(t.id, ""?"") or CONTAINS(t.id, ""\\"") ");
while (invalidItemsIterator.HasMoreResults)
{
    foreach (JObject itemWithInvalidId in await invalidItemsIterator.ReadNextAsync())
    {
        // Choose a new ID that doesn't contain special characters.
        // If that isn't possible, then Base64 encode the ID to escape the special characters.
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(itemWithInvalidId["id"].ToString());
        itemWithInvalidId["id"] = Convert.ToBase64String(plainTextBytes).Replace('/', '!');

        // Update the item with the new ID value by using the RID-based container reference.
        JObject item = await containerByRid.ReplaceItemAsync<JObject>(
            item: itemWithInvalidId,
            ID: itemWithInvalidId["_rid"].ToString(),
            partitionKey: new Cosmos.PartitionKey(itemWithInvalidId["status"].ToString()));

        // Validating the new ID can be read by using the original name-based container reference.
        await this.Container.ReadItemAsync<ToDoActivity>(
            item["id"].ToString(),
            new Cosmos.PartitionKey(item["status"].ToString())); ;
    }
}

Очистка в связи с истечением срока жизни

Элементу задано свойство Срок жизни (TTL). Элемент очищен из-за истечения срока действия свойства TTL.

Решение:

Измените свойство TTL, чтобы предотвратить очистку элемента.

Отложенное индексирование

Отложенное индексирование не выполнило наверстывание.

Решение:

Дождитесь, пока индексирование выполнит наверстывание, или измените политику индексирования.

Родительский ресурс удален

База данных или контейнер, в которых находится элемент, удалены.

Решение:

  1. Восстановление из резервной копии родительского ресурса или повторное создание ресурсов.
  2. Создайте новый ресурс для замены удаленного ресурса.

7. В именах контейнеров и коллекций учитывается регистр.

Имена контейнеров и коллекций в Azure Cosmos DB чувствительны к регистру.

Решение:

Обязательно используйте точное имя при подключении к Azure Cosmos DB.

Дальнейшие действия