Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Twitter의 snowflake
최흥배
https://jacking75.github.io/
이 문서는 마지막에 있는 '참고' 리스트에 있는 글들을 참고하여 정리한 것 + 본인이 추가한 것이다.
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
Unique ID를 생성하는 방법
❏ 수치 Count Up
❏ RDBMS의 number increment 기능 사용
오라클의 sequence
MySQL의 auto increment
❏ 구현이 간단하다.
❏ ID 생성 처리가 1대의 RDBMS에 집중되어 분산하기 어렵도. 스케
일 아웃 할 수 없다.
❏ 장점: 순서 보증, 유일성 보증을 어떤 수단을 통해서 만족해야 한다.
간단하게 ‘ID를 발행하는 사람은 한 사람’ 라는 형태로
❏ 단점: 구조 상 처리 성능을 확장하기 어렵다.
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 사이즈로 너무 큰 값이다...
Unique ID 생성 요구 사항
❏ 병렬로 유일한 ID를 생성할 수 있을 것.
❏ 가능한 작은 사이즈로 ID 생성을 할 수 있을 것.
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
snowflake
❏ 64bit의 long 값으로 ID를 표현(선두 1bit는 0)
❏ 3개의 요소로 구성
timestamp(41bit)
현재의 unixtime(ms)에서 어느 시점의 unixtime를 뺀 값
machine id(10it)
생성기에 할당된 ID. datacenter id + workerid
sequence(12bit)
생성기 마다 채번할 sequence 번호
같은 시간, 같은 머신에서 값이 중복되는 것을 방지
snowflake
❏ Q: timestamp는 41bit로 문제 없는가?
❏ A: Web 서비스 ID에서 사용하는 걸로는 충분하다
snowflake에서는
‘현재의 unixtime - 채번 시작 시의 unixtime’을 timestamp 값으로
사용한다.
timestamp가 넘치는 것은 채번 시작에서 약 69년 후의 일이다.
snowflake
❏ ID 생성 부분 소스 분석
현재의 unixtime을 얻는다
snowflake
❏ ID 생성 부분 소스 분석
1회 전에 얻은 unixtime 보다 지금의 unixtime이
오랜된 경우는 throw exception
(OS의 시간이 거슬러 간 경우)
snowflake
❏ ID 생성 부분 소스 분석
sequence 번호의 count up
같은 timesstamp 값 중에서
12bit만큼(04095)까지 채번 할 수 있다.
snowflake
❏ ID 생성 부분 소스 분석
만일 sequence 번호가 고갈된 경우는
unixtime가 새롭게 된다(1ms가 경과될
때까지 기다린다).
snowflake
❏ ID 생성 부분 소스 분석
이번 회 사용한 unixtime을 보존한다
snowflake
❏ ID 생성 부분 소스 분석
ID 생성
(timestamp << 22 + datacenterId << 17 +
workerId << 12 + sequence)
snowflake
❏ ID 생성 부분 소스 분석
twepoch가 채번 시작 시의 unixtime
1288834974657 = 2010/11/04 10:42:54
snowflake 장점
❏ ID 정렬 = 시계열 정렬
ID 정보 만으로 ID 생성 시의 timestamp 값을 기초로한 시계열 정렬
가능
❏ ID 값에서 ID 생성시의 timestamp 값이 복원 가능
timestamp = (id >> 22) + twepoch
❏ 정수 열 압축을 이용한 효율적인 정보 압축이 가능
Twitter의 snowflake 소개 및 활용
snowflake 단점
❏ OS의 시각 차이에 약하다.
❏ 운영상 궁리가 다소 필요
❏ ID 채번 시에 snowflake 서버에 thrift 경유로 접속하도록 되어 있다.
❏ 중~소규모에서 운용할 때는 배보다 배꼽이 더 큰 느낌
실행 횟수
처리 시간
1회당 처리 시간
snowflake 닷넷 프레임워크 버전
https://github.com/ccollie/snowflake-net
snowflake 닷넷 프레임워크 버전 예제
public class SeqNumberManager
{
static IdWorker IDWorker;
public static void Init(Int64 workerId, Int64 dataCenterId)
{
IDWorker = new IdWorker(workerId, dataCenterId);
}
public static Int64 GetSeqNumber()
{
// NextId 호출은 스레드 세이프 하다
return IDWorker.NextId();
}
}
(일어)Twitter의 snowflake에 대해서
http://www.slideshare.net/moaikids/20130901-snowflake
(일어)snowflake 사례
http://anond.hatelabo.jp/20120112192203
(일어)Snowflake의 ID 생성 방법
http://easylater.blogspot.kr/2012/04/snowflakeid.html
Snowflake.Net(닷넷 버전)
https://github.com/ccollie/snowflake-net
ItemSerial에 대한 고민
http://npteam.net/930
참고

More Related Content

Twitter의 snowflake 소개 및 활용

  • 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년 후의 일이다.
  • 12. snowflake ❏ ID 생성 부분 소스 분석 현재의 unixtime을 얻는다
  • 13. snowflake ❏ ID 생성 부분 소스 분석 1회 전에 얻은 unixtime 보다 지금의 unixtime이 오랜된 경우는 throw exception (OS의 시간이 거슬러 간 경우)
  • 14. snowflake ❏ ID 생성 부분 소스 분석 sequence 번호의 count up 같은 timesstamp 값 중에서 12bit만큼(04095)까지 채번 할 수 있다.
  • 15. snowflake ❏ ID 생성 부분 소스 분석 만일 sequence 번호가 고갈된 경우는 unixtime가 새롭게 된다(1ms가 경과될 때까지 기다린다).
  • 16. snowflake ❏ ID 생성 부분 소스 분석 이번 회 사용한 unixtime을 보존한다
  • 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 경유로 접속하도록 되어 있다. ❏ 중~소규모에서 운용할 때는 배보다 배꼽이 더 큰 느낌
  • 23. snowflake 닷넷 프레임워크 버전 https://github.com/ccollie/snowflake-net
  • 24. snowflake 닷넷 프레임워크 버전 예제 public class SeqNumberManager { static IdWorker IDWorker; public static void Init(Int64 workerId, Int64 dataCenterId) { IDWorker = new IdWorker(workerId, dataCenterId); } public static Int64 GetSeqNumber() { // NextId 호출은 스레드 세이프 하다 return IDWorker.NextId(); } }
  • 25. (일어)Twitter의 snowflake에 대해서 http://www.slideshare.net/moaikids/20130901-snowflake (일어)snowflake 사례 http://anond.hatelabo.jp/20120112192203 (일어)Snowflake의 ID 생성 방법 http://easylater.blogspot.kr/2012/04/snowflakeid.html Snowflake.Net(닷넷 버전) https://github.com/ccollie/snowflake-net ItemSerial에 대한 고민 http://npteam.net/930 참고