🛠️

Whiz Tools

Build • Create • Innovate

스노우플레이크 ID 생성기 및 분석 도구

분산 시스템에서 사용되는 고유 64비트 식별자인 Twitter 스노우플레이크 ID를 생성하고 분석합니다. 이 도구를 사용하면 새로운 스노우플레이크 ID를 생성하고 기존 ID를 구문 분석하여 타임스탬프, 머신 ID 및 시퀀스 번호 구성 요소에 대한 통찰력을 제공합니다.

스노우플레이크 ID 생성기

스노우플레이크 ID 생성기

Optional: Unix timestamp in milliseconds (defaults to current time)
📚

문서

Snowflake ID 생성기

소개

Snowflake ID는 분산 시스템에서 사용되는 고유 식별자로, 원래 Twitter에서 개발되었습니다. 이 도구를 사용하면 타임스탬프, 머신 ID 및 시퀀스 번호로 구성된 64비트 정수인 Snowflake ID를 생성하고 분석할 수 있습니다.

Snowflake ID 작동 방식

Snowflake ID는 다음과 같은 구조를 가진 64비트 정수입니다:

  • 41 비트: 타임스탬프 (사용자 정의 에포크 이후 밀리초)
  • 10 비트: 머신 ID (5 비트는 데이터 센터 ID, 5 비트는 작업자 ID)
  • 12 비트: 시퀀스 번호

이 구조는 머신당 밀리초당 약 4,096개의 고유 ID를 생성할 수 있게 해줍니다.

Snowflake ID 생성기 사용 방법

  1. (선택 사항) 사용자 정의 에포크 설정 (기본값은 Twitter의 에포크: 2010-11-04T01:42:54.657Z)
  2. 머신 ID (0-31) 및 데이터 센터 ID (0-31) 입력
  3. "생성" 버튼을 클릭하여 새로운 Snowflake ID 생성
  4. 생성된 ID와 그 구성 요소가 표시됩니다.

기존 Snowflake ID를 구문 분석하려면 "ID 구문 분석" 필드에 입력하고 "구문 분석" 버튼을 클릭합니다.

공식

Snowflake ID는 비트 연산을 사용하여 구성됩니다:

1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2

여기서:

  • timestamp는 에포크 이후 밀리초 수입니다.
  • datacenterId는 5비트 정수 (0-31)입니다.
  • workerId는 5비트 정수 (0-31)입니다.
  • sequence는 12비트 정수 (0-4095)입니다.

계산

Snowflake ID 생성기는 다음 단계를 수행합니다:

  1. 현재 타임스탬프를 밀리초 단위로 가져옵니다.
  2. 타임스탬프가 마지막으로 사용된 타임스탬프보다 큰지 확인합니다 (고유성을 위해).
  3. 타임스탬프가 동일하면 시퀀스 번호를 증가시킵니다.
  4. 시퀀스 번호가 오버플로우되면 (4096에 도달하면) 다음 밀리초를 기다립니다.
  5. 비트 연산을 사용하여 구성 요소를 결합하여 최종 ID를 생성합니다.

사용 사례

Snowflake ID는 다음과 같은 경우에 특히 유용합니다:

  1. 분산 시스템: 여러 머신에서 조정 없이 고유 ID 생성
  2. 대량 데이터: 대규모 데이터 세트에 대한 정렬 가능한 ID 생성
  3. 마이크로서비스: 서로 다른 서비스 간의 고유 식별자 보장
  4. 데이터베이스 샤딩: 효율적인 샤딩을 위해 타임스탬프 또는 머신 ID 구성 요소 사용

대안

Snowflake ID는 강력하지만 다른 ID 생성 시스템도 포함됩니다:

  1. UUID (범용 고유 식별자): 정렬 가능성 없이 분산 생성이 필요할 때 유용합니다.
  2. 자동 증가 데이터베이스 ID: 단순하지만 단일 데이터베이스 인스턴스에 제한됩니다.
  3. ULID (범용 고유 레키시컬 정렬 식별자): Snowflake와 유사하지만 다른 구조를 가집니다.

엣지 케이스 및 제한 사항

  1. 시계 동기화: Snowflake ID는 시스템 시간을 기반으로 합니다. NTP 조정 또는 일광 절약 시간 변경으로 인해 시계가 뒤로 이동하면 ID 생성에 문제가 발생할 수 있습니다.

  2. 2038년 문제: 41비트 타임스탬프는 2079년에 오버플로우됩니다 (Twitter 에포크 기준). Snowflake ID를 사용하는 시스템은 이 문제를 계획해야 합니다.

  3. 머신 ID 충돌: 대규모 분산 시스템에서는 고유 머신 ID를 보장하는 것이 어려울 수 있으며 추가 조정이 필요할 수 있습니다.

  4. 시퀀스 오버플로우: 매우 높은 처리량 시나리오에서는 밀리초당 4096개의 시퀀스를 소진할 수 있어 지연이 발생할 수 있습니다.

  5. 머신 간 비단조성: ID는 단일 머신에서 단조롭게 증가하지만 여러 머신 간에는 반드시 단조롭지 않을 수 있습니다.

역사

Snowflake ID는 2010년 Twitter에 의해 분산되고 시간 정렬 가능한 고유 식별자의 필요성을 해결하기 위해 도입되었습니다. 이후 많은 다른 회사와 프로젝트에서 채택되고 수정되었습니다.

예시

다양한 언어로 구현된 Snowflake ID 생성기 예시입니다:

1class SnowflakeGenerator {
2  constructor(epoch = 1288834974657, datacenterIdBits = 5, workerIdBits = 5, sequenceBits = 12) {
3    this.epoch = BigInt(epoch);
4    this.datacenterIdBits = datacenterIdBits;
5    this.workerIdBits = workerIdBits;
6    this.sequenceBits = sequenceBits;
7    this.maxDatacenterId = -1n ^ (-1n << BigInt(datacenterIdBits));
8    this.maxWorkerId = -1n ^ (-1n << BigInt(workerIdBits));
9    this.sequenceMask = -1n ^ (-1n << BigInt(sequenceBits));
10    this.workerIdShift = BigInt(sequenceBits);
11    this.datacenterIdShift = BigInt(sequenceBits + workerIdBits);
12    this.timestampLeftShift = BigInt(sequenceBits + workerIdBits + datacenterIdBits);
13    this.sequence = 0n;
14    this.lastTimestamp = -1n;
15  }
16
17  nextId(datacenterId, workerId) {
18    let timestamp = this.currentTimestamp();
19
20    if (timestamp < this.lastTimestamp) {
21      throw new Error('시계가 뒤로 이동했습니다. ID 생성을 거부합니다.');
22    }
23
24    if (timestamp === this.lastTimestamp) {
25      this.sequence = (this.sequence + 1n) & this.sequenceMask;
26      if (this.sequence === 0n) {
27        timestamp = this.tilNextMillis(this.lastTimestamp);
28      }
29    } else {
30      this.sequence = 0n;
31    }
32
33    this.lastTimestamp = timestamp;
34
35    return ((timestamp - this.epoch) << this.timestampLeftShift) |
36           (BigInt(datacenterId) << this.datacenterIdShift) |
37           (BigInt(workerId) << this.workerIdShift) |
38           this.sequence;
39  }
40
41  tilNextMillis(lastTimestamp) {
42    let timestamp = this.currentTimestamp();
43    while (timestamp <= lastTimestamp) {
44      timestamp = this.currentTimestamp();
45    }
46    return timestamp;
47  }
48
49  currentTimestamp() {
50    return BigInt(Date.now());
51  }
52}
53
54// 사용법
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`생성된 Snowflake ID: ${id}`);
58

다이어그램

다음은 Snowflake ID 구조의 시각적 표현입니다:

타임스탬프 (41 비트) 머신 ID (10 비트) 시퀀스 (12 비트)

64비트 Snowflake ID 구조

참고 자료

  1. "Snowflake 발표." Twitter 엔지니어링 블로그, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "Snowflake ID." 위키백과, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "마이크로서비스에서의 분산 ID 생성." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f