Diagnosticar e solucionar problemas de exceções não encontradas no Azure Cosmos DB
APLICA-SE A: NoSQL
O código de status HTTP 404 representa que o recurso não existe mais.
Comportamento esperado
Há muitos cenários válidos em que um aplicativo espera um código 404 e lida corretamente com o cenário.
Uma exceção não encontrada foi retornada para um item que deveria existir ou existe
Aqui estão os possíveis motivos para um código de status 404 ser retornado se o item deveria existir ou existir.
A sessão de leitura não está disponível para o token de sessão de entrada
Solução:
- Atualize seu SDK atual para a versão mais recente disponível. As causas mais comuns para esse erro específico foram corrigidas nas versões mais recentes do SDK.
Condição de corrida
Há várias instâncias de cliente do SDK e a leitura ocorreu antes da gravação.
Solução:
- A consistência de conta padrão para o Azure Cosmos DB é a consistência da sessão. Quando um item é criado ou atualizado, a resposta retorna um token de sessão que pode ser passado entre instâncias do SDK para garantir que a solicitação de leitura seja lida de uma réplica com essa alteração.
- Altere o nível de consistência para um nível mais forte.
Leitura da taxa de transferência de um contêiner ou recurso de banco de dados
Usando o PowerShell ou CLI do Azure e receber uma mensagem de erro não encontrado.
Solução:
A taxa de transferência pode ser provisionada no nível do banco de dados, no nível do contêiner ou em ambos. Se você receber um erro não encontrado, tente ler a taxa de transferência do recurso de banco de dados pai ou o recurso de contêiner filho.
Combinação inválida de chave de partição e ID
A chave de partição e a combinação de IDs não são válidas.
Solução:
Corrija a lógica de aplicativo que está causando a combinação incorreta.
Caractere inválido em uma ID de item
Um item é inserido no Azure Cosmos DB com um caractere inválido na ID do item.
Solução:
Altere a ID para um valor diferente que não contenha os caracteres especiais. Se a alteração da ID não for uma opção, você poderá codificar a ID em Base64 para fazer o escape dos caracteres especiais. A Base64 ainda pode produzir um nome com um caractere inválido '/' que precisa ser substituído.
Os itens já inseridos no contêiner para a ID podem ser substituídos usando valores RID em vez de referências baseadas em nome.
// 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())); ;
}
}
Limpeza de vida útil
O item tinha a propriedade TTL (vida real) definida. O item foi limpo porque a propriedade TTL expirou.
Solução:
Altere a propriedade TTL para impedir que o item seja limpo.
Indexação lenta
A indexação lenta não foi capturada.
Solução:
Aguarde até que a indexação seja capturada ou altere a política de indexação.
Recurso pai excluído
O banco de dados ou contêiner em que o item existe foi excluído.
Solução:
- Restaure a partir de um backup o recurso pai ou recrie os recursos.
- Crie um novo recurso para substituir o recurso excluído.
7. Os nomes de contêiner/coleção diferenciam maiúsculas de minúsculas
Os nomes de contêiner/coleção diferenciam maiúsculas de minúsculas no Azure Cosmos DB.
Solução:
Certifique-se de usar o nome exato ao se conectar ao Azure Cosmos DB.
Próximas etapas
- Diagnosticar e solucionar problemas ao usar o SDK do .NET para o Azure Cosmos DB.
- Saiba mais sobre as diretrizes de desempenho para o .NET v3 e o .NET v2.
- Diagnosticar e solucionar problemas ao usar o SDK do Java v4 para o Azure Cosmos DB.
- Saiba mais sobre as diretrizes de desempenho para o SDK do Java v4.