Azure Cosmos DB 찾을 수 없음 예외 진단 및 문제 해결
적용 대상: NoSQL
HTTP 상태 코드 404는 리소스가 더 이상 존재하지 않음을 나타냅니다.
예상되는 동작
애플리케이션에서 코드 404를 예상하고 시나리오를 올바르게 처리하는 다양한 시나리오를 사용할 수 있습니다.
존재하거나 존재해야 하는 항목에 대해 찾을 수 없음 예외가 반환되었습니다.
항목이 존재하거나 존재해야 하는 경우 상태 코드 404가 반환되는 이유는 다음과 같습니다.
읽기 세션을 입력 세션 토큰에 사용할 수 없음
해결 방법:
- 현재 SDK를 사용 가능한 최신 버전으로 업데이트합니다. 이 특정 오류의 가장 일반적인 원인은 최신 SDK 버전에서 수정되었습니다.
경합 조건
여러 SDK 클라이언트 인스턴스가 있으며 쓰기 전에 읽기가 발생했습니다.
해결 방법:
- Azure Cosmos DB에 대한 기본 계정 일관성은 세션 일관성입니다. 항목이 만들어지거나 업데이트되면 응답에서 SDK 인스턴스 간에 전달될 수 있는 세션 토큰을 반환하여 읽기 요청이 해당 변경 내용이 있는 복제본을 읽도록 합니다.
- 일관성 수준을 더 높은 수준으로 변경합니다.
컨테이너 또는 데이터베이스 리소스에 대한 처리량 읽기
PowerShell 또는 Azure CLI를 사용하고 찾을 수 없음 오류 메시지를 받습니다.
해결 방법:
처리량은 데이터베이스 수준, 컨테이너 수준 또는 둘 다에서 프로비저닝할 수 있습니다. 찾을 수 없음 오류가 발생하면 부모 데이터베이스 리소스 또는 하위 컨테이너 리소스의 처리량을 읽어보세요.
잘못된 파티션 키 및 ID 조합
파티션 키와 ID 조합이 유효하지 않습니다.
해결 방법:
잘못된 조합을 발생시키는 애플리케이션 논리를 수정합니다.
항목 ID의 잘못된 문자
항목 ID에 잘못된 문자가 포함된 항목이 Azure Cosmos DB에 삽입됩니다.
해결 방법:
ID를 특수 문자를 포함하지 않는 다른 값으로 변경합니다. ID 변경이 옵션이 아닌 경우 ID를 Base64로 인코딩하여 특수 문자를 이스케이프할 수 있습니다. Base64는 대체해야 하는 잘못된 문자 '/'로 이름을 계속 생성할 수 있습니다.
ID에 대해 컨테이너에 이미 삽입된 항목은 이름 기반 참조 대신 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(Time to Live) 제거
항목에 TTL(Time to Live) 속성이 설정되었습니다. TTL 속성이 만료되어 항목이 제거되었습니다.
해결 방법:
항목이 제거되지 않도록 TTL 속성을 변경합니다.
지연 인덱싱
지연 인덱싱이 catch되지 않았습니다.
해결 방법:
인덱싱이 인덱싱 정책을 따라잡거나 변경할 때까지 기다리세요.
부모 리소스 삭제됨
항목이 존재하는 데이터베이스 또는 컨테이너가 삭제되었습니다.
해결 방법:
- 부모 리소스를 백업에서 복원하거나 리소스를 다시 만듭니다.
- 삭제된 리소스를 대체할 새 리소스를 만듭니다.
7. 컨테이너/컬렉션 이름은 대/소문자를 구분합니다.
컨테이너/컬렉션 이름은 Azure Cosmos DB에서 대/소문자를 구분합니다.
해결 방법:
Azure Cosmos DB에 연결하는 동안 정확한 이름을 사용해야 합니다.
다음 단계
- Azure Cosmos DB .NET SDK를 사용하고 있는 경우 문제를 진단 및 해결합니다.
- .NET v3 및 .NET v2의 성능 지침에 대해 알아봅니다.
- Azure Cosmos DB Java v4 SDK를 사용할 때 발생하는 문제를 진단하고 해결합니다.
- Java v4 SDK의 성능 지침에 대해 알아봅니다.