Snowflake 간단 설명

마수리·2023년 2월 10일
0
post-thumbnail

새로운 곳에서 새로운 경험을 쌓는 중 마이크로서비스로써 다양한 서버들이 통신하는 중 고유한 ID를 Snowflake로 만들어 사용하는 것을 보고 정리한 내용을 포스팅합니다. Snowflake는 안정적으로 오랫동안 사용되고 있는 기술인 만큼 저희 프로젝트에서도 강력한 도구로써 잘 사용되고 있습니다.


등장 배경
Snowflake는 트위터의 서비스가 성장함에 따라 관리해야 하는 데이터의 수가 점점 많아지고 더욱 더 많은 사용자에게 빠르게 응답해야 하는 상황에서 트위터는 데이터의 고유ID의 생성을 32bit로 한정하지 않으면서 동시에 더욱 더 빠르게 생성되길 바랐습니다. 이러한 요구사항으로 트위터는 Snowflake를 개발하게 되었습니다.


장점

  • 확장성: 대규모 데이터 웨어하우징 어플리케이션의 요구사항을 충족하도록 원활하게 확장 가능하도록 설계 되었습니다. 매우 큰 데이터와 수천 명의 동시사용자를 쉽게 처리할 수 있습니다.
  • 성능: 고성능으로 사용자에게 매우 빠른 응답을 줄 수 있습니다.
  • 사용 용의성: 간단하고 사용자 친화적 인터페이스를 갖고 있어 신속하게 실행 가능합니다.

최근 트랜드인 마이크로서비스에 적합한 ID 생성 방식입니다.


구성방식

Snowflake는 위의 그림과 같이 구성됩니다.

  • timestamp: ID를 발급했을 당시의 시간을 밀리초까지 표시
  • instance: 서버의 고유 ID
  • sequence: 서버에서 발급하는 증가되는 고유 값으로 thread마다 다른 값을 가집니다.

동작 방식
고유한 ID가 필요한 데이터가 서버에게 고유한 ID의 발급을 요청합니다. 그럼 위에서 본 구조대로 timestamp + instance + sequence 조합의 ID를 반환합니다. 구성 방식을 보면 timestamp와 instance는 쉽게 이해가 가지만 과연 sequence는 어떻게 동작하고 얼마나 빠른지 알아볼 필요가 있어 보입니다.


NEXT VALUE
sequence는 NEXT VALUE라는 함수를 이용해서 기존에 sequence로 계산된 값에 1을 증가해 반환합니다. 여기서 증분 값은 옵션으로 변경 가능합니다. NEXT VALUE 기능은 고성능으로 설계되었으며 과부하 상태에서도 초당 수천 개의 고유 값을 생성할 수 있게 설계되었습니다. 하지만 실제 성능은 ID생성 하드웨어, 네트워크 인프라, 호출 클라서터의 워크로드 등에 따라 다른 속도를 보일 순 있습니다.


모든 ID값은 sequential 한가?
ID를 만드는 서버가 1개라면 sequence 값은 일정하게 늘어 sequential 한 값이 생성 될 것입니다. 하지만 여러 서버에서 Snowflake를 사용해서 ID를 만든다면 각 서버마다 sequence 값을 만들어 내어 sequence만으로 값을 정렬할 수 없게 됩니다. 그래서 Snowflake의 정렬은 timestamp로 해야 합니다.


생성 설명 영상
https://www.youtube.com/watch?v=aLYKd7h7vgY

profile
.NET 개발자 마수리입니다 🖐

0개의 댓글