1. Distributed Lock (분산 락)
- 분산 락(Distributed Lock)은 여러 서버에서 동시에 접근할 수 있는 자원에 대한 동시성을 관리하기 위한 메커니즘입니다.
- 분산 환경에서 동일한 자원에 대한 경쟁 상태(Race Condition)를 방지하고 데이터 일관성을 보장하는 데 사용됩니다.
- MSA(Micro Service Architecture) 환경에서 특히 중요한 개념으로, 여러 독립적인 서비스가 공유 자원에 안전하게 접근하기 위해 필수적입니다.
2. 분산 락의 필요성
- 일반적으로 하나의 서버에서만 접근할 수 있는 자원에 대해서는 언어에서 제공하는 락을 사용하여 동기화를 보장할 수 있습니다.
- 예를 들어, Java에서는
synchronized키워드나ReentrantLock을 사용하여 메서드나 블록에 락을 걸 수 있습니다. - 이 경우, 하나의 JVM 내에서의 동기화는 보장됩니다.
- 예를 들어, Java에서는
- 하지만 여러 서버에서 접근할 수 있는 자원에 대해서는 이러한 로컬 동기화 메커니즘을 사용할 수 없습니다.
- 한 서버에 락이 걸려있더라도 다른 서버로 동일한 요청이 가게 된다면 동기화를 보장할 수 없습니다.
- 이런 경우에 분산 락을 사용하여 여러 서버 간의 동기화를 보장할 수 있습니다.
- 분산 락은 Redis, ZooKeeper, 데이터베이스 등 공통된 저장소를 이용하여 자원이 사용 중인지를 체크합니다. 그래서 전체 서버에서 동기화된 처리가 가능해집니다.
2.1 실제 사용 사례
- 재고 관리 시스템에서 동일 상품에 대한 동시 주문 처리
- 중복 결제 방지
- 동시 예약 시스템(공연, 좌석, 숙소 등)
- 특정 사용자에 대한 동시 작업 제한
- 대규모 배치 작업의 중복 실행 방지
- 리더 선출(Leader Election)
실제 사례: 우아한형제들 재고 이관
우아한형제들은 WMS(창고 관리 시스템)에서 재고 이관 작업 시 Redisson을 활용한 분산 락을 구현했습니다. 이를 통해 다수의 사용자가 동시에 같은 재고에 접근하는 경우에도 데이터 일관성을 유지하면서 성공적으로 이관 작업을 수행할 수 있었습니다.
3. 분산 락의 구현 방법
- 분산 락을 구현하는 방법은 여러 가지가 있습니다.
- Redis를 활용한 방법(SETNX, Redisson)
- 데이터베이스를 활용한 방법(SELECT FOR UPDATE, 락 테이블)
- ZooKeeper를 이용한 방법
- etcd를 이용한 방법
- 가장 많이 사용되는 방법은 Redis를 이용한 분산 락입니다.
- Redis는 빠른 속도와 높은 가용성 덕분에 분산 락을 구현하는 데 적합합니다.