7. 유일한 ID 생성기

💬 프로덕션 환경에서의 유일한 ID 생성

  • 여러 데이터베이스 서버를 사용한다면 RDBMS의 auto_increment 속성을 사용하지 못하는 경우가 많다.

  • 각 데이터베이스 서버가 동시에 요청을 받고 있는데 ID를 중복되지 않게 할당하려면, 각 서버의 요청 순서를 반영해 ID를 생성해야 하므로 지연이 필히 발생할 것이다.

  • 따라서 프로덕션 환경에서는 더욱 고도화된 ID 생성 전략이 필요하다.

💬 ID에 대한 조건

  • 유일해야 한다.

  • 숫자로만 구성되어야 한다.

  • 64비트로 표현될 수 있는 값이어야 한다.

  • 발급 날짜에 따라 정렬 가능해야 한다.

  • 초당 10,000개의 ID를 만들 수 있어야 한다.

💬 ID 생성 방식

다중 마스터 복제

  • 데이터베이스의 auto_increment 기능을 사용하되, 다음 ID를 구할 때 현재 데이터베이스 서버 수만큼 더한다.

  • 예를 들어 3개의 데이터베이스 서버를 샤딩해두었다면, 한 서버에서 생성한 ID 값에 3을 더한 ID가 next ID가 된다.

  • 단점

    • 여러 데이터 센터에 걸쳐 규모를 확장하기에 어렵다.

    • 각 데이터베이스 서버마다 생성된 ID 값이 다르므로 ID 값이 시간 흐름에 맞추어 커지는 것을 보장할 수 없다.

    • 서버를 추가하거나 삭제할 때 동작시키기 어렵다.

UUID

  • 128비트로 표현된다.

  • 충돌 가능성이 매우 낮다.

  • 서버 간 조율할 필요 없이 각자 아이디를 생성해도 괜찮다.

  • 단점

    • ID를 시간 순으로 정렬할 수 없다.

    • ID에 숫자가 아닌 값이 포함될 수 있다.

티켓 서버

  • 아이디를 생성할 수 있는 별도 서버를 두는 방식이다.

  • 단점

    • 티켓 서버에 장애가 발생하면 모든 서버에 장애가 전파되는 SPoF가 발생할 수 있어 위험하다.

snowflake

  • 타임스탬프

    • epoch 이후로 몇 ms가 경과했는지 나타내는 값이다. snowflake는 트위터에서 개발되었기 때문에 트위터 기원 시각을 epoch로 두고 있다.

    • 타임스탬프가 맨 앞에 존재하므로 ID는 시간순으로 정렬될 수 있다.

  • 데이터센터 ID

    • 5비트이므로 총 32개의 데이터 센터를 분류할 수 있다.

  • 서버 ID

    • 데이터 센터 당 32개의 서버를 분류할 수 있다.

  • 일련번호

    • ID를 생성할 때 마다 증가시키며 1ms 단위로 초기화된다. 따라서 하나의 서버에서 1ms에 2^12 = 4096 만큼의 아이디를 만들 수 있다.

Last updated