요구사항
- 중복되지 않는 키를 할당 받는다.
- 분산된 컴퓨터에서 각자 생성 가능해야 한다.
- DB에서 PK로 사용 가능 해야 한다.
- 시간순으로 정렬 가능
- 크기는 64bit를 지원
- 3000명 동접 1초당 60fps 기준으로 1프레임(16ms)에 아이템 1개 생성시 180,000개가 생성 가능해야 한다.
대상
- GUID
- 중복되지 않는 키를 할당 받는다.(Time backward가 발생하지 않는 경우)
- 분산된 컴퓨터에서 각자 생성 가능
- DB에서 PK로 사용하면 부하가 심함(128bit 해쉬키를 사용하여 database page split이 발생함)
- DB 서버의 자동 증가 키를 이용한 방법
- 단점
- 쓰기 병목이 발생한다.(짝수, 홀수 키로 분리하더라도 병목을 피할 수 없다.)
- 네트워크를 통해 비동기 할당을 받아야 한다.
- 트위터에서 공개한 Snowflake
- 중복되지 않는 키를 할당 받는다.(Time backward가 발생하지 않는 경우)
- 분산된 컴퓨터에서 각자 생성 가능
- DB에서 PK로 사용 가능해야 한다.
- 시간순으로 정렬 가능(timestamp로 정렬 가능)
- 크기 64bit
- 1초당 생성 가능한 갯수 : 1000 [millisec] * (2^12)[sequence number] = 4,096,000
- folcon(c++11에서 사용 가능)
- 1초당 생성 가능한 갯수 : 약 100만개 이상
결론 : 각 서버간 NTP 시간 동기화를 사용하고, timestamp가 포함된 64bit id generator를 사용한다.
(시간 동기화는 Time backward를 방지하는 옵션과 함께 사용한다. ex) ntpd의 -x 옵션)
참조
덧글을 달아 주세요
TTF 2016/08/31 13:38 고유주소 고치기 답하기
PID/TID 최대값은 16bit라는 링크
https://groups.google.com/d/msg/microsoft.public.win32.programmer.kernel/YybDBuIuBbs/04HxZ5DC9vQJ
TTF 2016/08/31 13:41 고유주소 고치기 답하기
Global Unique Object ID 생성 방법에 대한 정리
https://charsyam.wordpress.com/2012/12/26/입-개발-global-unique-object-id-생성-방법에-대한-정리/