ItemSerial에 대한 고민

게임 개발을 하면서 고민하는 것 중에 하나가 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 옵션)

참조
2014/01/03 01:28 2014/01/03 01:28

덧글을 달아 주세요