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