Diagnosticar e solucionar problemas de exceções não encontradas do Azure Cosmos DB
APLICA-SE A: NoSQL
O código de estado HTTP 404 indica que o recurso já não existe.
Comportamento esperado
Há muitos cenários válidos em que um aplicativo espera um código 404 e manipula corretamente o cenário.
Uma exceção não encontrada foi retornada para um item que deveria existir ou existe
Aqui estão as possíveis razões para um código de status 404 ser devolvido se o item deve existir ou existe.
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 race
Há várias instâncias de cliente SDK e a leitura aconteceu 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.
- Mude o nível de consistência para um nível mais forte.
Taxa de transferência de leitura para um contêiner ou recurso de banco de dados
Usando o PowerShell ou a CLI do Azure e receber a mensagem de erro não encontrada .
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 receber um erro não encontrado , tente ler a taxa de transferência do recurso de banco de dados pai ou do recurso de contêiner filho.
Chave de partição inválida e combinação de ID
A combinação de chave de partição e ID não é válida.
Solução:
Corrija a lógica do aplicativo que está causando a combinação incorreta.
Caractere inválido em um ID de item
Um item é inserido no Azure Cosmos DB com um caractere inválido na ID do item.
Solução:
Altere o ID para um valor diferente que não contenha os caracteres especiais. Se alterar o ID não for uma opção, você poderá codificar o ID para escapar dos caracteres especiais. 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://video2.skills-academy.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())); ;
}
}
Tempo de Viver a purga
O item tinha a propriedade Time to Live (TTL) 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 preguiçosa
A indexação preguiçosa não pegou.
Solução:
Aguarde até que a indexação recupere ou altere a política de indexação.
Recurso pai excluído
O banco de dados ou contêiner no qual 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óximos passos
- Diagnostique e solucione problemas ao usar o SDK .NET do Azure Cosmos DB.
- Saiba mais sobre as diretrizes de desempenho para .NET v3 e .NET v2.
- Diagnostique e solucione problemas ao usar o SDK Java v4 do Azure Cosmos DB.
- Saiba mais sobre as diretrizes de desempenho para Java v4 SDK.