분산락이란 경쟁 상황(Race Condition) 이 발생할때, 하나의 공유자원에 접근할때 데이터에 결함이 발생하지 않도록 원자성(atomic) 을 보장하는 기법.
분산락이 필요한 이유:
서버가 한대가 아니라 여러 대인 경우 여러 서버로 API가 분산 호출 됨
서버들간에 동기화된 처리가 필요하고, 여러 서버에 공통된 락을 적용해야 하기 때문에 redis 를 이용하여 분산락을 이용한다.
만약 서버1, 서버2, 서버3 이 있다면 레디스로부터 모두 동일한 락을 얻을 수 있어야 한다는 뜻.
즉, 분산 락의 주요 용도는 동시에 공유 자원을 수정하려는 시스템 클러스터에서 경쟁 조건을 피하고 데이터 일관성을 보장하는 것이다.
정산 서버와 주문 서버가 거의 동시간에 상품 재고에 액세스 했다고 가정하자.
상품 재고가 100개 남았는데 주문 서버가 재고를 -1 한 시점에서 정산 서버가 바라본 상품 재고는 아직 100개 일것이다. 즉, 데이터가 일관되지 못한 문제가 있다.
이 사진 처럼 하나의 자원에 여러 서버가 동시에 접근할 경우 데이터 정합성이 깨질 수 있음.
이때 Redis를 이용해 락을 걸어주어 한번에 하나의 서버의 액세스만 허용하는것을 분산 락
이라 한다.
주문 서버와 정산 서버가 거의 동시에 레디스에 접근했지만 주문 서버가 미세한 차이로 더 빨랐으므로 주문 서버가 상품 재고에 접근할 권한을 얻었다. 그로 인해 정산 서버는 접근 권한을 얻지 못한다.
RDBMS도 락 기능을 지원한다. 근데 왜 레디스로 락을 얻을까? 그 이유는 속도의 차이 때문이다. DB에서 락을 얻는 속도보다 인메모리DB인 레디스에서 락을 얻는 속도가 훨씬 빠르기 때문.