Snowflake ID란? 분산 환경에서 고유 ID 생성하기

Snowflake ID의 정의

Snowflake ID는 트위터(현 X)가 개발한 분산 환경용 고유 ID 생성 방식입니다. 여러 서버에서 동시에 데이터를 만들어도 서로 겹치지 않는 유일한 값을 빠르게 생성하기 위해 만들어졌습니다. 일반적으로 DB의 auto increment 기능을 쓰면 서버가 하나일 때는 문제가 없지만, 여러 서버가 동시에 데이터를 저장하는 분산 환경에서는 중복이나 순서 충돌이 발생할 수 있습니다. Snowflake는 이런 문제를 해결하기 위해 시간 정보와 서버 식별 정보를 조합해 ID를 만듭니다.

동작 원리와 구조

Snowflake ID는 보통 64비트 정수로 구성되며, 다음과 같은 정보를 조합합니다.

  • 타임스탬프(현재 시각, 밀리초 단위)
  • 데이터센터 ID 또는 머신 ID(서버 구분값)
  • 시퀀스 번호(같은 밀리초 안에서 생성된 순번)

예를 들어 우체국에서 등기번호를 만들 때 ‘접수 날짜 + 지점 코드 + 그날의 접수 순번’을 조합하면 전국 어디서 접수해도 중복되지 않는 번호가 만들어지는 것과 비슷한 원리입니다. 각 서버는 자신의 머신 ID를 미리 부여받고, 현재 시각과 자신만의 시퀀스 번호를 붙여 ID를 생성하기 때문에 다른 서버와 통신하지 않고도 충돌 없는 ID를 즉시 만들 수 있습니다. 예를 들어 timestamp: 41bit, datacenter: 5bit, worker: 5bit, sequence: 12bit 형태로 비트를 나누는 구조가 대표적입니다.

실무에서 왜 쓰는지

실무에서 Snowflake ID를 쓰는 이유는 크게 두 가지입니다. 첫째, 중앙 서버에 ID 발급을 요청할 필요가 없어 성능이 뛰어납니다. DB의 auto increment는 매번 DB에 접근해 순번을 받아야 하지만, Snowflake는 각 서버가 독립적으로 계산만 하면 되므로 네트워크 지연이 없습니다. 둘째, ID에 타임스탬프가 포함되어 있어 생성 시간 순으로 정렬이 가능합니다. 이런 특성 때문에 Discord, Instagram 같은 대규모 서비스나 MSA(마이크로서비스 아키텍처) 환경에서 여러 서비스가 동시에 데이터를 생성할 때 고유성과 정렬성을 동시에 보장하는 ID 전략으로 널리 사용되고 있습니다.

댓글 남기기