다음을 통해 공유


Azure 역할 내 캐시의 동시성 모델

중요

Microsoft는 모든 새 개발에서 Azure Redis Cache를 사용하는 것이 좋습니다. Azure Cache 제품 선택에 대한 현재 설명서 및 지침 은 나에게 적합한 Azure Cache 제품을 참조하세요.

캐싱 아키텍처를 사용하면 캐시 클라이언트에 적절한 네트워크 액세스와 구성 설정이 있는 경우 해당 클라이언트가 캐시된 데이터에 액세스할 수 있습니다. 따라서 동시성 문제가 나타납니다.

응용 프로그램의 동시성 문제를 처리하는 데 도움이 되도록 낙관적/비관적 동시성 모델이 모두 지원됩니다.

낙관적 동시성 모델

낙관적 동시성 모델에서는 캐시된 개체에 대한 업데이트가 잠기지 않습니다. 대신 캐시 클라이언트가 캐시에서 개체를 가져올 때 해당 개체의 현재 버전도 가져와 저장합니다. 업데이트가 필요하면 캐시 클라이언트에서 개체의 새 값을 저장된 버전 개체와 함께 보냅니다. 전송된 버전이 캐시에 있는 현재 개체 버전과 일치하는 경우에만 시스템에서 개체를 업데이트합니다. 개체에 대한 모든 업데이트는 해당 버전 번호를 변경하므로 다른 사용자의 변경 내용을 덮어쓰지 않습니다.

이 항목의 예제에서는 낙관적 동시성이 데이터 일관성을 유지하는 방법에 대해 설명합니다.

예제

다음 예제에서 두 개의 캐시 클라이언트(cacheClientAcacheClientB)는 동일한 키 RadioInventory가 포함되어 있는 캐시된 동일 개체를 업데이트하려고 합니다.

시간 0: 두 클라이언트 모두 동일한 개체를 검색합니다.

시간 0(T0)에서 두 캐시 클라이언트가 모두 DataCacheItem 클래스를 인스턴스화하여 업데이트하려는 캐시된 개체를 버전 및 태그 정보 등의 캐시된 해당 개체에 연결된 추가 정보와 함께 캡처합니다. 다음 코드 예제에서 이 내용을 보여 줍니다.

'cacheClientA pulls the FM radio inventory from cache
Dim clientACacheFactory As DataCacheFactory = New DataCacheFactory()
Dim cacheClientA As DataCache = _
        clientACacheFactory.GetCache("catalog")
Dim radioInventoryA As DataCacheItem = _
        cacheClientA.GetCacheItem("RadioInventory")

'cacheClientB pulls the same FM radio inventory from cache
Dim clientBCacheFactory As DataCacheFactory = New DataCacheFactory()
Dim cacheClientB As DataCache = _
       clientBCacheFactory.GetCache("catalog")
Dim radioInventoryB As DataCacheItem = _
        cacheClientB.GetCacheItem("RadioInventory")
//cacheClientA pulls the FM radio inventory from cache
DataCacheFactory clientACacheFactory = new DataCacheFactory();
DataCache cacheClientA = clientACacheFactory.GetCache("catalog");
DataCacheItem radioInventoryA = 
    cacheClientA.GetCacheItem("RadioInventory");

//cacheClientB pulls the same FM radio inventory from cache
DataCacheFactory clientBCacheFactory = new DataCacheFactory();
DataCache cacheClientB = clientBCacheFactory.GetCache("catalog");
DataCacheItem radioInventoryB= 
    cacheClientB.GetCacheItem("RadioInventory");

참고

이 예제에서는 GetCacheItem 메서드를 사용하여 DataCacheItem 개체를 검색하여 버전 정보를 가져오지만 Get 메서드를 사용하여 검색된 캐시 항목과 연결된 DataCacheItemVersion 개체를 가져올 수도 있습니다.

시간 1: 첫 번째 업데이트 성공

시간 1(T1)에서 cacheClientA는 캐시된 개체 RadioInventory를 새 값으로 업데이트합니다. cacheClientAPut 메서드를 실행하면 RadioInventory 캐시 항목과 연결된 버전이 증분됩니다. 이때 cacheClientB에는 오래된 캐시 항목이 포함되어 있습니다. 다음 예에서 확인할 수 있습니다.

'at time T1, cacheClientA updates the FM radio inventory
Dim newRadioInventoryA As Integer = 155

cacheClientA.Put("RadioInventory", newRadioInventoryA, _
                 radioInventoryA.Version)
//at time T1, cacheClientA updates the FM radio inventory
int newRadioInventoryA = 155;

cacheClientA.Put("RadioInventory", newRadioInventoryA, 
    radioInventoryA.Version);

시간 2: 두 번째 업데이트 실패

시간 2(T2)에서 cacheClientB는 이제 오래된 버전 번호를 사용하여 RadioInventory 캐시된 개체를 업데이트하려고 합니다. cacheClientA의 변경 내용을 덮어쓰지 않도록 하기 위해 cacheClientBPut 메서드 호출에 실패합니다. 캐시 클라이언트는 ErrorCode 속성이 CacheItemVersionMismatch로 설정된 DataCacheException 개체를 throw합니다. 다음 코드 예제에서 이 내용을 보여 줍니다.

'later, at time T2, cacheClientB tries to 
'update the FM radio inventory, receives DataCacheException with
'an error code equal to DataCacheErrorCode.CacheItemVersionMismatch.
Dim newRadioInventoryB As Integer = 130

cacheClientB.Put("RadioInventory", newRadioInventoryB, _
                 radioInventoryB.Version)
//later, at time T2, cacheClientB tries to 
//update the FM radio inventory, receives DataCacheException with
//an error code equal to DataCacheErrorCode.CacheItemVersionMismatch.
int newRadioInventoryB = 130;

cacheClientB.Put("RadioInventory", newRadioInventoryB,
    radioInventoryB.Version);

비관적 동시성 모델

비관적 동시성 모델에서는 클라이언트가 개체를 명시적으로 잠근 상태에서 작업을 수행합니다. 잠금을 요청하는 다른 작업은 잠금이 해제될 때까지 거부됩니다(시스템이 요청을 차단하지는 않음). 개체가 잠기면 잠금 핸들이 출력 매개 변수로 반환됩니다. 개체의 잠금을 해제하려면 잠금 핸들이 필요합니다. 잠긴 개체가 해제되기 전에 클라이언트 응용 프로그램이 종료될 경우 잠금을 해제하기 위한 시간 제한이 제공됩니다. 잠긴 개체는 만료되지 않지만 만료 시간이 경과되면 잠금 해제된 직후에 만료될 수 있습니다.

비관적 동시성 모델과 함께 사용되는 메서드에 대한 자세한 내용은 동시성 메서드를 참조하세요.

참고

여러 작업에 걸친 트랜잭션은 지원되지 않습니다.

참고

캐시를 사용하는 응용 프로그램은 잠금 순서를 결정하고 교착 상태(해당하는 경우)를 검색합니다.

경고

캐시의 잠긴 개체는 캐시 클라이언트에서 Put 메서드를 사용하여 계속 바꿀 수 있습니다. 캐시 사용 응용 프로그램은 비관적 동시성 모델을 사용하는 항목에 일관적으로 PutAndUnlock을 사용합니다.

참고 항목

개념

Azure 캐시의 역할 내 캐시 기능