2. 이 문서는 마지막에 있는 '참고' 리스트에 있는 글들을 참고하여 정리한 것 + 본인이 추가한 것이다.
6. Unique ID를 생성하는 방법
❏ 수치 Count Up
❏ RDBMS의 number increment 기능 사용
오라클의 sequence
MySQL의 auto increment
❏ 구현이 간단하다.
❏ ID 생성 처리가 1대의 RDBMS에 집중되어 분산하기 어렵도. 스케
일 아웃 할 수 없다.
❏ 장점: 순서 보증, 유일성 보증을 어떤 수단을 통해서 만족해야 한다.
간단하게 ‘ID를 발행하는 사람은 한 사람’ 라는 형태로
❏ 단점: 구조 상 처리 성능을 확장하기 어렵다.
7. Unique ID를 생성하는 방법
❏ RFC 4122 “A Universally Unique IDentifier(UUID)”
http://www.ietf.org/rfc/rfc4122.txt
❏ “UUID는 분산 시스템 상에서 어떤 곳에서 통제하지 않아도 유일 성을
가진 식별자를 만드는 것을 목표로 한다....” (wikipedia)
❏ 128bit 데이터로 ID를 표현한다
예:550e8400-e29b-41d4-a716-446655440000
❏ 장점: 복수의 머신에서 병렬로 동작해도 유일한 ID를 생성할 수 있다.
❏ 단점: 그러나 128bit는 ID 사이즈로 너무 큰 값이다...
8. Unique ID 생성 요구 사항
❏ 병렬로 유일한 ID를 생성할 수 있을 것.
❏ 가능한 작은 사이즈로 ID 생성을 할 수 있을 것.
9. snowflake
❏ Twitter이 OSS로 공개하고 있는 ID 생성기
https://github.com/twitter/snowflake/
❏ Time-base한 ID
❏ 64bit로 ID를 표현
❏ 복수의 머신을 운용하여 병렬로 유일성을 가진 ID를 생성할 수 있
다.
❏ 스칼라 언어로 구현
❏ 1초당 생성 가능한 갯수 : 1000 [millisec] * (2^12)[sequence
number] = 4,096,000
10. snowflake
❏ 64bit의 long 값으로 ID를 표현(선두 1bit는 0)
❏ 3개의 요소로 구성
timestamp(41bit)
현재의 unixtime(ms)에서 어느 시점의 unixtime를 뺀 값
machine id(10it)
생성기에 할당된 ID. datacenter id + workerid
sequence(12bit)
생성기 마다 채번할 sequence 번호
같은 시간, 같은 머신에서 값이 중복되는 것을 방지
11. snowflake
❏ Q: timestamp는 41bit로 문제 없는가?
❏ A: Web 서비스 ID에서 사용하는 걸로는 충분하다
snowflake에서는
‘현재의 unixtime - 채번 시작 시의 unixtime’을 timestamp 값으로
사용한다.
timestamp가 넘치는 것은 채번 시작에서 약 69년 후의 일이다.
17. snowflake
❏ ID 생성 부분 소스 분석
ID 생성
(timestamp << 22 + datacenterId << 17 +
workerId << 12 + sequence)
18. snowflake
❏ ID 생성 부분 소스 분석
twepoch가 채번 시작 시의 unixtime
1288834974657 = 2010/11/04 10:42:54
19. snowflake 장점
❏ ID 정렬 = 시계열 정렬
ID 정보 만으로 ID 생성 시의 timestamp 값을 기초로한 시계열 정렬
가능
❏ ID 값에서 ID 생성시의 timestamp 값이 복원 가능
timestamp = (id >> 22) + twepoch
❏ 정수 열 압축을 이용한 효율적인 정보 압축이 가능
21. snowflake 단점
❏ OS의 시각 차이에 약하다.
❏ 운영상 궁리가 다소 필요
❏ ID 채번 시에 snowflake 서버에 thrift 경유로 접속하도록 되어 있다.
❏ 중~소규모에서 운용할 때는 배보다 배꼽이 더 큰 느낌