Cosmos DB는 Microsoft의 새로운 NoSQL 스토어는 Azure 클라우드에서 출시되었습니다. 관계형 데이터베이스와 달리 호스팅형 데이터베이스 서비스인 만큼 확장성이 뛰어나 트랜잭션이 많은 .NET과 .NET Core 응용 프로그램. 그러나 Cosmos DB를 사용하면 Microsoft가 데이터베이스에 대한 각 트랜잭션에 대해 비용을 청구하므로 데이터베이스 액세스에 대한 성능 병목 현상 및 비용 오버헤드에 주의해야 합니다.
Cosmos DB는 트랜잭션 용량 측면에서 확장 가능하지만 데이터베이스 서비스가 애플리케이션과 비교하여 별도의 VNet 또는 구독에 상주하기 때문에 빠르지 않습니다. 따라서 애플리케이션이 Azure 클라우드에서 실행되는 경우에도 VNet을 통해 데이터베이스에 액세스하면 성능에 큰 타격을 줄 수 있습니다.
이 두 가지 문제를 해결하려면 Cosmos DB 애플리케이션에 캐싱을 도입하는 것이 이상적입니다. 80-90%의 시간 동안 애플리케이션이 데이터베이스 대신 캐시에서 데이터를 가져오기 때문에 애플리케이션 성능이 크게 향상되는 동시에 운영 비용이 크게 절감됩니다.
NCache 세부 정보 Cosmos DB와 캐시 동기화 Cosmos DB-웹 세미나에서 캐싱 사용
Cosmos DB에서 캐싱 사용
다음 코드 조각은 Cosmos DB에서 캐싱을 사용하는 방법을 설명합니다. 아마도 Cosmos DB 인스턴스에는 고객 컬렉션이 포함되어 있을 것입니다.
- 캐시 키를 기반으로 캐시에서 지정된 고객을 검색합니다.
- 항목이 캐시에 없으면 Cosmos DB를 쿼리하여 고객을 검색합니다.
- 고객이 데이터베이스 컬렉션에 있으면 항목을 검색합니다.
- 데이터 일관성을 보장하기 위해 만료 값이 5분인 캐시에 지정된 고객을 추가합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// Generate a unique cache key string key = $"Customer:ALFKI"; // First look for data in cache var retrievedItem = cache.Get<Customer>(key); // If not found in the cache, fetch data from the database and add it to the cache if (retrievedItem == null) { // New instance of CosmosClient class using a primary connection string CosmosClient client = new CosmosClient("connection-string-from-portal"); // Get container object Container container = client.GetContainer("Northwind", "Customer"); // Create partition key and id // Here, the id is CustomerID and Partition Key is City in the Customer class PartitionKey partitionKey = new PartitionKey("Seattle"); String id = "ALFKI"; // Read item from the container using the id and partitionKey var itemResponse = container.ReadItemAsync<Customer>(id, partitionKey).Result; // get customer object from database response Customer customer = itemResponse.Resource; // Initialize cache item with customer data and set expiration var cacheItem = new CacheItem(customer); cacheItem.Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); // Insert cacheItem in cache against the given key cache.Insert(key, cacheItem); } |
NCache 세부 정보 알림 확장 가능 종속성 NCache 기술 문서
사용 NCache Cosmos DB를 사용하는 분산 캐시로
Cosmos DB로 작업할 때 애플리케이션은 로드 밸런서를 통해 다중 서버 환경에서 실행되는 트랜잭션이 많은 애플리케이션일 가능성이 높으며 풍부한 데이터베이스 호출을 수행합니다. 또한 이 환경에서는 독립형 캐시가 불가능하므로 다음과 같은 분산 캐시가 필요합니다. NCache 애플리케이션과 데이터베이스 사이.
A 분산 캐시 트랜잭션 부하가 증가함에 따라 더 많은 캐시 서버를 추가할 수 있으므로 캐시가 병목 현상을 일으키지 않습니다. 따라서 확장성의 주요 문제인 관계형 데이터베이스와 달리 애플리케이션과 데이터베이스 사이에 충분한 캐시 서버를 가질 수 있기 때문에 애플리케이션 서버의 수는 중요하지 않습니다.
Cosmos DB는 관계형 데이터베이스보다 훨씬 더 효율적으로 확장되지만 여전히 다음과 같은 메모리 내 분산 캐시와 일치하지 않습니다. NCache 애플리케이션의 VNet과 함께 합니다. 실제로 캐시의 일부는 애플리케이션 프로세스 자체에 상주합니다( 클라이언트 캐시), 당신에게 inProc 캐싱 속도.
NCache 세부 정보 캐시 작업 NCache NCache 기술 문서
데이터베이스 항목 수집 캐싱
분산 캐시를 사용하면 특히 읽기 작업에 대해 네트워크를 통한 데이터베이스 이동을 줄여 Cosmos DB 애플리케이션의 성능을 크게 향상시킬 수 있습니다. 따라서 데이터베이스에서 단일 엔터티를 검색할 수 있지만 처리량 및 감소된 R/U(단위당 요청) 측면에서 훨씬 더 경제적인 접근 방식은 데이터베이스에서 항목 컬렉션을 검색하고 캐싱 계층에서 작업을 적용하는 것입니다.
이 목적을 위해, NCache 각각 고유한 캐시 키에 대해 컬렉션의 개별 요소를 캐싱하는 것과 함께 컬렉션을 단일 캐시 항목으로 캐싱할 수 있습니다. 컬렉션 상태에 대한 모든 변경 사항은 나중에 작업이 끝날 때 데이터베이스로 푸시될 수 있습니다.
NCache 세부 정보 Cosmos DB와 캐시 동기화 NCache 기술 문서
단일 항목으로 캐시 수집
예를 들어 모든 독일 고객과 같이 컬렉션 항목을 집합적으로 로드하려는 경우 컬렉션을 단일 항목으로 캐시할 수 있습니다. 독일의 모든 고객에 대해 Cosmos DB를 쿼리하고 결과를 단일 목록으로 반환한 다음 추가 사용을 위해 캐시에 추가할 수 있습니다.
다음 코드 샘플은 데이터베이스에서 독일 고객 목록을 검색하기 위해 이 작업을 수행하는 방법을 보여줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
string key = $"CustomersFromGermany"; // First look for data in cache IDistributedList<Customer>germanCustomers = cache.DataTypeManager.GetList<Customer>(key); // If not found in the cache, fetch data from the database and add it to the cache if (germanCustomers == null) { // Create a query var query = new QueryDefinition("SELECT * FROM Customers c WHERE c.Country = 'Germany'"); // Get query iterator FeedIterator<Customer>feedIterator = container.GetItemQueryIterator<Customer>(query); // Specify expiration attribute for List var attributes = new DataTypeAttributes(); attributes.Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); // Create a list to store customers as a collection germanCustomers = cache.DataTypeManager.CreateList<Customer>(key, attributes); // Read DB data using feed while (feedIterator.HasMoreResults) { var response = feedIterator.ReadNextAsync().Result.Resource; foreach (Customer customer in response) { germanCustomers.Add(customer); } } } |
NCache 세부 정보 캐시 만료 캐시 작업 NCache
수집 항목을 별도로 캐시
메타데이터를 캐시 항목과 연결할 수 있습니다. NCache 다음과 같은 고유 식별자를 통해 데이터를 분류합니다. 태그. 이러한 방식으로 단일 식별자(예: 독일에 속한 고객)에 대해 캐시에서 여러 항목을 검색할 수 있습니다.
이를 위해 Cosmos DB에서 독일 고객을 쿼리하고 Customer: Country: Germany와 같은 태그를 결과 항목에 연결할 수 있습니다. 이러한 항목을 개별적으로 캐싱하면 다양한 쿼리 조합에 사용할 수 있으며 단일 고객을 더 빠르게 가져올 수 있습니다.
이전 예를 사용하여 먼저 고객: 국가: 독일 태그가 있는 고객 캐시를 검색합니다. 캐시에 항목이 없는 경우 "국가" 특성이 "독일"로 지정된 고객 컬렉션의 항목에 대해 Cosmos DB를 쿼리합니다. 그러나 이제 컬렉션 항목을 별도로 캐시하려고 하므로 다음을 수행합니다.
- 데이터베이스에서 항목을 가져오면 항목의 만료 값을 지정합니다.
- 각 캐시 항목에 대해 고객: 국가: 독일 태그를 지정합니다.
- 대량으로 캐시에 항목을 추가합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// Create a dictionary to add bulk items in the cache var collectionItems = new Dictionary<string, CacheItem>(); CacheItem cacheItem = null; var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); // Read DB data using feed while (feedIterator.HasMoreResults) { var response = feedIterator.ReadNextAsync().Result.Resource; foreach (Customer customer in response) { cacheItem = new CacheItem(customer); cacheItem.Expiration = expiration; //Create a unique key for each item in collection string itemKey = $"Customer:{customer.CustomerID}"; // Add cacheItem to dictionary collectionItems.Add(itemKey, cacheItem); } } // Insert customer collection items seperately using bulk operation if (collectionItems.Count > 0) { cache.InsertBulk(collectionItems); } |
NCache 세부 정보 캐시의 태그 캐시 작업 NCache
NCache Azure에서 배포
주요 클라우드 마켓플레이스 제공 NCache, Azure 및 AWS와 같은 사이트 사용을 위해 다운로드합니다. 다른 모든 클라우드 시스템의 경우 다운로드하여 설치할 수 있습니다. NCache BYOL(Bring Your Own License) 모델의 가상 머신에서. NCache 다음과 같은 방식으로 Azure에 배포됩니다.
- 배포 NCache Cloud Azure에서
- 배포 NCache 가상 머신으로
- 사용 NCache Azure의 PaaS(Platform-as-a-Service) 제품에서.
이러한 옵션에 대한 자세한 내용은 다음을 참조하십시오. 클라우드 배포 옵션 NCache.
NCache 세부 정보 NCache AWS에서 NCache Cloud Service
결론
요약하면 Cosmos DB 애플리케이션에 캐싱을 도입하면 속도, 안정성 및 가용성이 향상됩니다. 사용하여 NCache Cosmos DB를 사용하면 캐시가 애플리케이션 프로세스 내에 있기 때문에 애플리케이션 성능이 크게 향상됩니다. 둘째, 비용이 많이 드는 데이터베이스를 Cosmos DB로 이동하지 않고도 데이터의 80-90%에 액세스할 수 있으므로 비용이 크게 절감됩니다.