출처 : http://npteam.net/930
게임 개발을 하면서 고민하는 것 중에 하나가 ItemSerial 생성에 관련된 문제이다.
요구사항
- 중복되지 않는 키를 할당 받는다.
- 분산된 컴퓨터에서 각자 생성 가능해야 한다.
- 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 옵션)
참조
댓글