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