Foundry
분산 시스템
심화

분산 락과 단일 실행 보장

락은 만료된다. 안전한 상호배제의 조건

분산 락과 단일 실행 보장

어디서 필요한가

  • 배치 서버 3대가 같은 스케줄을 돌리면 같은 작업이 세 번 실행된다
  • 정산 마감, 쿠폰 발급처럼 한 번만 실행돼야 하는 작업에 상호배제가 필요하다

최소 요구 조건

조건이유
원자적 획득SET key value NX PX 30000 처럼 한 명령으로 획득
TTL 만료보유자가 죽어도 영구 잠김이 되지 않도록
소유자 확인 후 해제토큰을 비교해 남의 락을 지우지 않도록
갱신 또는 충분한 TTL작업이 TTL보다 길어지면 두 프로세스가 동시 진입

락만으로 부족한 순간

프로세스A 락 획득 → GC 정지 20s → TTL 만료
                    프로세스B 락 획득 → 쓰기
프로세스A 깨어나 쓰기 → 결과적으로 두 번 쓰기
  • 저장소가 펜싱 토큰(단조 증가 번호)을 검사해 낮은 번호의 쓰기를 거부해야 정확성이 보장된다

실무 포인트

  • 성능 최적화용 락은 Redis로 충분하지만, 정확성이 돈과 직결되면 etcd, ZooKeeper 같은 합의 기반을 쓴다
  • 락 구간은 최소로 잡고 외부 API 호출을 락 안에 넣지 않는다
  • 락이 필요 없게 만드는 편이 낫다. 파티션 키로 단일 소비자를 만들거나, DB 유니크 제약과 낙관적 락을 쓴다
면접에서 이렇게 나옵니다

Q.배치 서버가 여러 대일 때 중복 실행을 어떻게 막나요?

답변을 준비하고 있어요. 우선 위 본문에서 근거를 찾아보세요.

Q.분산 락에 TTL을 두는 이유와 그로 인한 위험은?

답변을 준비하고 있어요. 우선 위 본문에서 근거를 찾아보세요.

Q.락을 잡았는데도 동시 실행이 발생하는 시나리오를 설명해주세요

답변을 준비하고 있어요. 우선 위 본문에서 근거를 찾아보세요.

Q.락을 쓰지 않고 단일 실행을 보장하는 방법이 있나요?

답변을 준비하고 있어요. 우선 위 본문에서 근거를 찾아보세요.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

분산 시스템 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.