캐시의 낙관적 잠금과 비관적 잠금
NCache 이 시스템은 낙관적 잠금과 비관적 잠금을 모두 포함하는 효율적인 분산 잠금 메커니즘을 제공하여 여러 클라이언트가 동시에 캐시 데이터에 접근하고 업데이트하는 환경에서 데이터 동기화 및 무결성을 보장합니다. 캐시 수준의 동시성 제어를 통해, NCache 캐시 클러스터 전체에서 읽기 및 쓰기 작업에 대한 원자성, 일관성 및 격리성을 유지하는 데 도움이 됩니다.
공유 캐시 리소스에 동시에 접근할 때는 잠금이 필수적입니다. 그렇지 않으면 병렬 작업으로 인해 경쟁 조건과 데이터 불일치가 발생할 수 있기 때문입니다. NCache 이 요구 사항은 애플리케이션이 배타적 잠금(비관적 잠금)을 획득하거나 버전 기반(낙관적 잠금) 충돌 감지에 의존할 수 있도록 함으로써 해결되며, 동일한 데이터에 대한 모든 업데이트에 대해 전체 캐시 클러스터에서 일관성을 보장합니다. 또한, NCache 이 API는 특정 캐시 데이터를 잠가서 단일 스레드 또는 애플리케이션만 업데이트하거나 읽을 수 있도록 합니다.
분산 잠금은 언제 사용해야 할까요?
문제 정책
두 명의 계좌 소유자가 하나의 은행 계좌를 사용한다고 가정해 보겠습니다. 계좌 잔액은 5000달러입니다. 첫 번째 사용자(User 1)는 계좌에서 2000달러를 인출하고, 두 번째 사용자(User 2)는 1000달러를 입금하려고 합니다. 이러한 조건 하에서, 인출 및 입금 후 계좌 잔액은 4000달러가 되어야 합니다(5000-2000=3000, 3000+1000=4000).
이제 두 사용자가 동시에 작업을 수행하고 애플리케이션이 동시 업데이트를 제대로 처리하지 못한다고 가정해 보겠습니다. 다음과 같은 상황이 발생할 수 있습니다.
사용자 1이 계정 잔액을 확인했는데 $5000가 표시되었습니다. 그는 $2000를 인출하고 총 잔액은 $3000가 됩니다.
사용자 2가 계정 잔액을 확인하면 $5000가 표시됩니다. 그는 $1000를 입금하고 총 잔액은 $6000가 됩니다.
다음 다이어그램은 시나리오를 시각적으로 보여줍니다.
해법
이러한 공유 리소스 문제를 해결하기 위해, NCache 이 플랫폼은 동시성 요구 사항에 따라 적용할 수 있는 두 가지 잠금 방식을 제공합니다.
첫 번째 접근 방식은 한 사용자가 계좌에서 작업을 수행하는 동안 해당 계좌를 독점적으로 잠급니다. 이 독점적 잠금이 유지되는 동안 다른 사용자는 동일한 계좌를 읽거나 업데이트할 수 없습니다. 사용자가 출금을 완료하고 잠금을 해제하면 다른 사용자가 안전하게 입금할 수 있습니다. 이 접근 방식은 동시 접근을 방지하고 엄격한 일관성을 보장합니다.
두 번째 접근 방식은 여러 사용자가 동시에 은행 계좌에 접근할 수 있도록 합니다. 각 사용자는 계좌 정보를 읽고 조회할 수 있지만, 업데이트가 성공적으로 완료될 때마다 계좌 버전이 업데이트됩니다. 사용자가 잔액을 업데이트하려고 하면, 그 사이에 다른 업데이트가 발생하지 않았는지 확인하기 위해 버전이 검사됩니다. 버전이 변경된 경우, 업데이트 작업은 실패하고 사용자는 최신 잔액을 다시 가져온 후 재시도해야 합니다. 이 접근 방식은 데이터 일관성을 유지하면서 더 높은 동시 접속률을 허용합니다.
NCache 이 시스템은 비관적 잠금과 낙관적 잠금이라는 두 가지 잠금 메커니즘을 모두 제공합니다. 이에 대한 자세한 설명은 이후 섹션에서 확인할 수 있습니다.
낙관적 잠금 전략과 비관적 잠금 전략 비교
사용 가능한 잠금 장치에는 두 가지 유형이 있습니다. NCache:
비관적 잠금(배타적 잠금)
비관적 잠금은 다음을 사용합니다.LockHandle잠금이 유지되는 동안 다른 클라이언트가 캐시 항목에 접근할 수 없도록 합니다.낙관적 잠금(캐시 항목 버전 관리)
낙관적 잠금은 항목 버전 관리를 통해 동시성을 제어하는 메커니즘입니다. 이 메커니즘을 사용하면 항목이 다른 사용자에 의해 사용 가능하게 유지되지만, 항목에 대한 업데이트가 성공적으로 완료될 때마다 해당 항목이 버전 번호가 증가합니다.
도 참조
.그물: Alachisoft.NCache.런타임.캐싱 네임 스페이스.
자바 : com.alachisoft.ncache.런타임.캐싱 네임 스페이스.
Node.js : 캐시 클래스입니다.
파이썬 : ncache.런타임.캐싱 기준 치수.