Azure Cosmos DB는 새로운 NoSQL 최근 많은 인기를 얻고 있는 클라우드 기반 데이터베이스 솔루션입니다. Cosmos DB와 함께 캐싱을 사용하면 데이터베이스로의 이동을 줄여 애플리케이션 성능을 높이고 트랜잭션 비용을 최적화한다는 것은 누구나 알고 있습니다.
그러나 분산 캐시에서 Cosmos DB 데이터를 캐싱하면 이 데이터의 두 복사본이 생성될 수 있습니다. 하나는 데이터베이스에, 다른 하나는 캐시에 있습니다. 캐시에 액세스할 수 없는 애플리케이션이 Cosmos DB에서 이 데이터를 직접 변경하는 경우 캐시는 이를 인식하지 못합니다. 이로 인해 캐시에 데이터베이스와 비교하여 이전 데이터 복사본이 있습니다.
이 오래된 데이터는 오래된 데이터로 작업하면 성능에 큰 영향을 미치는 트랜잭션이 많은 다중 환경 애플리케이션의 주요 문제입니다. 이 블로그에서는 캐싱을 계속 사용하면서 이 "부실 데이터" 문제를 피할 수 있는 방법에 대해 설명합니다.
Cosmos DB와 캐시 동기화 NCache
NCache 강력한 기능이 풍부하게 포함된 매우 강력한 분산 캐싱 솔루션입니다. 모든 분산 캐시와 마찬가지로 NCache 데이터베이스와 애플리케이션 자체 사이에 위치하며 애플리케이션에서 사용할 데이터베이스의 데이터를 캐시합니다. 따라서 읽기/쓰기 시간이 기하급수적으로 감소합니다. 또한 다음과 같은 기능으로 오래된 데이터(앞서 논의) 문제를 해결합니다. 확장 가능한 종속성 알림.
NotifyExtensibleDependency를 통해 데이터베이스(이 경우 Cosmos DB)의 알림이 처리되는 사용자 지정 데이터 종속성 논리를 작성할 수 있습니다. NCache 를 사용하여 피드 변경 코스모스 DB의 메커니즘.
Cosmos DB의 모든 수정 사항은 NotifyExtensibleDependency 코드에 통합된 Cosmos DB 변경 피드 프로세서 논리를 사용하여 캡처할 수 있습니다. 이는 이벤트 처리 메커니즘을 사용하여 데이터베이스 콘텐츠 수정에 대한 응답으로 캐시 무효화를 적용하여 오래된 데이터가 캐시에 유지되지 않도록 하는 방법입니다.
의 ReadThru 제공자 기능을 사용할 수도 있습니다. NCache Cosmos DB 애플리케이션의 성능을 더욱 향상시키기 위해 이 기능을 통해 캐시가 캐시에 존재하지 않는 항목에 대해 데이터베이스에서 직접 조사하도록 할 수 있습니다. 캐시는 데이터베이스(Cosmos DB)에서 요청된 항목을 찾을 뿐만 아니라 성공적으로 검색되면 캐시 내부에 요청된 항목을 저장합니다.
NCache 세부 정보 NotifyExtensibleDependency 캐싱을 통해 읽기
Cosmos DB와 캐시 동기화: 빠른 예
예를 들어 Cosmos DB를 전자 상거래 상점의 데이터베이스로 사용하고 자주 사용하는 데이터를 NCache. 귀하의 상점에는 수만 개의 제품이 있으며 평균적으로 매일 백만 건의 거래가 발생합니다. NCache Cosmos 데이터베이스의 부하를 줄이는 데 도움이 되지만 캐시의 데이터가 부실해질 가능성이 있습니다. 위에서 논의한 바와 같이, NCache 전자 상거래 상점의 최적 기능을 보장하는 NotifyExtensibleDependency 기능으로 이 문제를 해결합니다.
다음 코드 예제에서는 NotifyExtensibleDependency 기능의 사용법을 보여줍니다. 이 예에서 제품은 해당 ID를 기반으로 데이터베이스에서 로드됩니다. 그런 다음 NotifyExtensibleDependency가 생성되고 가져온 제품에 대해 등록됩니다. 마지막으로 제품의 형태는 캐시 아이템 지정된 키와 함께 캐시에 삽입됩니다.
또한 CosmosDbNotificationDependency는 캐시에 배포된 공급자의 이름입니다. 이 공급자는 다음을 구현합니다. ICustomDependencyProvider 인터페이스.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Product product = LoadProductFromDatabase(productId); string providerName = "CosmosDbNotificationDependency"; //This is the name of your provider deployed on cache server string key = "Product#" + product.Id ; IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("Key", key); parameters.Add("CacheId", "myCache"); parameters.Add("EndPoint", ""); parameters.Add("AuthKey", ""); parameters.Add("DatabaseName", "demoDatabase"); parameters.Add("MonitoredCollection", "Customers"); parameters.Add("LeaseEndPoint", ""); parameters.Add("LeaseAuthKey", ""); parameters.Add("LeaseDatabaseName", "demoDatabase"); parameters.Add("LeaseCollection", "leases"); CacheItem item = new CacheItem(product); item.Dependency = new CustomDependency(providerName, parameters); _cache.Insert(key, item); |
구현과 관련된 자세한 내용은 다음을 참조하십시오. GitHub의 저장소.
NCache 세부 정보 NotifyExtensibleDependency 캐시 작업 NCache
캐시용 Read-Through 공급자
의 Read-Through 기능 NCache (이름에서 알 수 있듯이) 캐시에서 항목을 찾을 수 없는 경우 캐시를 통해 데이터베이스(Cosmos DB)로 직접 읽을 수 있습니다. 이 기능은 기본적으로 캐시에서 요청된 항목을 찾을 수 없을 때 데이터베이스에서 항목을 직접 찾는 번거로움을 덜어줍니다. 이 기능을 통해서 뿐만 아니라 NCache 요청된 항목에 대한 데이터베이스를 읽고 나중에 빠른 검색을 위해 캐시에 삽입합니다.
다음 코드 예제에서는 Get<> 메서드를 사용하여 지정된 키 "Product:1001"에 해당하는 read-through가 활성화된 항목을 검색합니다.
1 2 3 4 5 6 7 8 9 |
// Specify the key of the item string key = "Product:1001"; // Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product data = cache.Get(key, readThruOptions); |
NCache 세부 정보 캐싱을 통해 읽기 캐시 작업 NCache
결론
요약하자면, NCache Cosmos DB와 캐시 간의 데이터 동기화를 위한 유연한 솔루션을 제공하여 데이터 불일치를 방지합니다. NCache인 메모리 분산 캐싱 솔루션은 Cosmos DB가 보다 쉽게 액세스하고 처리할 수 있도록 최신 데이터를 유지하는 데 이상적인 매체가 될 수 있습니다.