SlideShare una empresa de Scribd logo
1 de 25
Descargar para leer sin conexión
Twitter의 snowflake
최흥배
https://jacking75.github.io/
이 문서는 마지막에 있는 '참고' 리스트에 있는 글들을 참고하여 정리한 것 + 본인이 추가한 것이다.
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
❏ 정수 열 압축을 이용한 효율적인 정보 압축이 가능
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
참고

Más contenido relacionado

La actualidad más candente

게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
Amazon Web Services Korea
 
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
VMware Tanzu Korea
 
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
Amazon Web Services Korea
 

La actualidad más candente (20)

Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
Spark 의 핵심은 무엇인가? RDD! (RDD paper review)
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
[Gaming on AWS] AWS와 함께 한 쿠키런 서버 Re-architecting 사례 - 데브시스터즈
[Gaming on AWS] AWS와 함께 한 쿠키런 서버 Re-architecting 사례 - 데브시스터즈[Gaming on AWS] AWS와 함께 한 쿠키런 서버 Re-architecting 사례 - 데브시스터즈
[Gaming on AWS] AWS와 함께 한 쿠키런 서버 Re-architecting 사례 - 데브시스터즈
 
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
 
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
게임서비스를 위한 ElastiCache 활용 전략 :: 구승모 솔루션즈 아키텍트 :: Gaming on AWS 2016
 
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
 
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
쿠키런: 킹덤 대규모 인프라 및 서버 운영 사례 공유 [데브시스터즈 - 레벨 200] - 발표자: 용찬호, R&D 엔지니어, 데브시스터즈 ...
 
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
 
왜 쿠버네티스는 systemd로 cgroup을 관리하려고 할까요
왜 쿠버네티스는 systemd로 cgroup을 관리하려고 할까요왜 쿠버네티스는 systemd로 cgroup을 관리하려고 할까요
왜 쿠버네티스는 systemd로 cgroup을 관리하려고 할까요
 
웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우웹서버 부하테스트 실전 노하우
웹서버 부하테스트 실전 노하우
 
jemalloc 세미나
jemalloc 세미나jemalloc 세미나
jemalloc 세미나
 
로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해
 
엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나엘라스틱서치, 로그스태시, 키바나
엘라스틱서치, 로그스태시, 키바나
 
[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기
[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기
[Spring Camp 2018] 11번가 Spring Cloud 기반 MSA로의 전환 : 지난 1년간의 이야기
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
AWS로 게임 기반 다지기 - 김병수, 박진성 :: AWS Game Master 온라인 세미나 #3
AWS로 게임 기반 다지기 - 김병수, 박진성 :: AWS Game Master 온라인 세미나 #3 AWS로 게임 기반 다지기 - 김병수, 박진성 :: AWS Game Master 온라인 세미나 #3
AWS로 게임 기반 다지기 - 김병수, 박진성 :: AWS Game Master 온라인 세미나 #3
 
Open source APM Scouter로 모니터링 잘 하기
Open source APM Scouter로 모니터링 잘 하기Open source APM Scouter로 모니터링 잘 하기
Open source APM Scouter로 모니터링 잘 하기
 
마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트)
마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트) 마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트)
마이크로서비스 기반 클라우드 아키텍처 구성 모범 사례 - 윤석찬 (AWS 테크에반젤리스트)
 

Destacado

Destacado (8)

Monkey space 2013
Monkey space 2013Monkey space 2013
Monkey space 2013
 
Unqlite
UnqliteUnqlite
Unqlite
 
Easyloggingpp
EasyloggingppEasyloggingpp
Easyloggingpp
 
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
 
MsgPack 정리
MsgPack 정리MsgPack 정리
MsgPack 정리
 
NLog 소개
NLog 소개NLog 소개
NLog 소개
 
signal과 slot, 그리고 jl_signal 라이브러리
signal과 slot, 그리고 jl_signal 라이브러리signal과 slot, 그리고 jl_signal 라이브러리
signal과 slot, 그리고 jl_signal 라이브러리
 
GDC Europe 2014: Unreal Engine 4 for Programmers - Lessons Learned & Things t...
GDC Europe 2014: Unreal Engine 4 for Programmers - Lessons Learned & Things t...GDC Europe 2014: Unreal Engine 4 for Programmers - Lessons Learned & Things t...
GDC Europe 2014: Unreal Engine 4 for Programmers - Lessons Learned & Things t...
 

Similar a Twitter의 snowflake 소개 및 활용

mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교
Woo Yeong Choi
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
xxbdxx
 

Similar a Twitter의 snowflake 소개 및 활용 (20)

mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 
(OCI 탐험일지) 인스턴스 생성
(OCI 탐험일지) 인스턴스 생성(OCI 탐험일지) 인스턴스 생성
(OCI 탐험일지) 인스턴스 생성
 
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
 
모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호
 
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
[D2]thread dump 분석기법과 사례
[D2]thread dump 분석기법과 사례[D2]thread dump 분석기법과 사례
[D2]thread dump 분석기법과 사례
 
Apache ZooKeeper 소개
Apache ZooKeeper 소개Apache ZooKeeper 소개
Apache ZooKeeper 소개
 
V8 engine internal
V8 engine internalV8 engine internal
V8 engine internal
 
Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014
 
오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기
 
하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_core
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
OpenStack Swift Debugging
OpenStack Swift DebuggingOpenStack Swift Debugging
OpenStack Swift Debugging
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
Windows kernel basic exploit
Windows kernel basic exploitWindows kernel basic exploit
Windows kernel basic exploit
 

Más de 흥배 최

KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
흥배 최
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
흥배 최
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
흥배 최
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
흥배 최
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
흥배 최
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
흥배 최
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
흥배 최
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용
흥배 최
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
흥배 최
 
[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index
흥배 최
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
흥배 최
 

Más de 흥배 최 (20)

Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]
 
Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Wtl 개요와 설치
Wtl 개요와 설치Wtl 개요와 설치
Wtl 개요와 설치
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
닷넷 Apache avro
닷넷 Apache avro닷넷 Apache avro
닷넷 Apache avro
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리
 
Mongodb 개발 포인트
Mongodb 개발 포인트Mongodb 개발 포인트
Mongodb 개발 포인트
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index[Sdc 3rd] Boost multi_index
[Sdc 3rd] Boost multi_index
 
[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11[KGC 2011]Boost 라이브러리와 C++11
[KGC 2011]Boost 라이브러리와 C++11
 

Twitter의 snowflake 소개 및 활용

  • 2. 이 문서는 마지막에 있는 '참고' 리스트에 있는 글들을 참고하여 정리한 것 + 본인이 추가한 것이다.
  • 3.
  • 4.
  • 5.
  • 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 ❏ 정수 열 압축을 이용한 효율적인 정보 압축이 가능
  • 20.
  • 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 참고