Skip to content

baker-1ee/snowflake-id-generator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

6 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Snowflake ID Generator (Java)

λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ 64λΉ„νŠΈ Long νƒ€μž…μ˜ μœ μΌν•œ ID λ₯Ό 생성해낼 수 μžˆλŠ” JAVA둜 개발된 ID 생성기이닀.

νŠΈμœ„ν„°μ—μ„œ 2010년에 λ°œν‘œν•œ Snowflake μ•Œκ³ λ¦¬μ¦˜ 기반으둜 κ°œλ°œν•˜μ˜€λ‹€.

μŠ€λ…Έμš°ν”Œλ ˆμ΄ν¬λŠ” 64λΉ„νŠΈλ‘œ 이루어진 ID둜, 각각의 λΉ„νŠΈλŠ” νŠΉμ • 의미λ₯Ό κ°–κ³  μžˆλ‹€.

image

첫 번째 λΉ„νŠΈλŠ” λΆ€ν˜Έ λΉ„νŠΈμ΄λ‹€. 0으둜 μ±„μ›Œμ„œ ID 값을 μ–‘μˆ˜λ‘œ λ§Œλ“€μ–΄μ€€λ‹€. λ‹€μŒ 41λΉ„νŠΈλŠ” νƒ€μž„μŠ€νƒ¬ν”„ λΉ„νŠΈμ΄λ‹€. ID 생성 μš”μ²­μΌμ˜ timestamp μ—μ„œ κΈ°μ€€μ‹œκ°„ timestamp λ₯Ό 뺀값을 μ €μž₯ν•œλ‹€. κΈ°μ€€μ‹œκ°„μœΌλ‘œλΆ€ν„° 69.73λ…„ λ™μ•ˆ κ³ μœ ν•œ ID 생성을 보μž₯ν•œλ‹€. λ‚˜λ¨Έμ§€ 10λΉ„νŠΈλŠ” μ„œλ²„ID λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. μ΅œλŒ€ 1024개의 λΆ„μ‚° μ„œλ²„μ—μ„œ μ‚¬μš©ν•΄λ„ κ³ μœ ν•œ ID 생성을 보μž₯ν•œλ‹€. λ‚˜λ¨Έμ§€ 12λΉ„νŠΈλŠ” μ‹œν€€μŠ€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 이λ₯Ό 톡해 λ™μΌν•œ millisecond의 μš”μ²­μ—λ„ κ³ μœ ν•œ ID 생성을 보μž₯ν•œλ‹€.

Snowflake ID의 μž₯점과 단점은 λ‹€μŒκ³Ό κ°™λ‹€.

μž₯점

  • κ³ μœ ν•œ ID 생성: λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ κ³ μœ ν•œ IDλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ κ°€μž₯ 일반적인 방법 쀑 ν•˜λ‚˜μ΄λ‹€. 이λ₯Ό 톡해 μ€‘λ³΅λœ IDκ°€ λ°œμƒν•˜λŠ” 것을 λ°©μ§€ν•  수 μžˆλ‹€.
  • 높은 ν™•μž₯μ„±: λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©ν•˜κΈ°μ— μ ν•©ν•œ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œμ—μ„œλ„ 효과적으둜 μž‘λ™ν•œλ‹€.
  • κ°„λ‹¨ν•œ μ‚¬μš©: μ‚¬μš©ν•˜κΈ°μ— κ°„λ‹¨ν•˜λ‹€. μ„œλ²„ μ‹€ν–‰ μ‹œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ 생성해두고 ID 생성이 ν•„μš”ν•œ κ³³μ—μ„œ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

단점

  • μ‹œμŠ€ν…œ μ‹œκ³„μ™€μ˜ μ˜μ‘΄μ„±: μ‹œμŠ€ν…œμ˜ μ‹œκ³„μ™€ λ°€μ ‘ν•œ 연관이 μžˆλ‹€. νŠΉμ • μ„œλ²„μ˜ μ‹œμŠ€ν…œ μ‹œκ³„κ°€ λ‹€λ₯Έ μ„œλ²„λ³΄λ‹€ λΉ λ₯΄λ‹€λ©΄, ν•΄λ‹Ή μ„œλ²„μ—μ„œ μƒμ„±ν•˜λŠ” ID의 νƒ€μž„μŠ€νƒ¬ν”„λŠ” 항상 λΉ λ₯Ό 것이닀.
  • νƒ€μž„μŠ€νƒ¬ν”„ μ˜€λ²„ν”Œλ‘œμš°: 41λΉ„νŠΈμ˜ νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μ‚¬μš©ν•˜μ—¬ IDλ₯Ό μƒμ„±ν•œλ‹€. μ΄λŸ¬ν•œ 이유둜, μ‹œμŠ€ν…œ μ‹œμž‘ 이후 69년이 μ§€λ‚˜λ©΄ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 μžˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ„œλ²„ID λΉ„νŠΈλ₯Ό 쀄이고, νƒ€μž„μŠ€νƒ¬ν”„ λΉ„νŠΈλ₯Ό λŠ˜λ¦¬λŠ” λ°©μ‹μœΌλ‘œ 보완 κ°€λŠ₯ν•˜λ‹€.
  • 이기쒅 ν†΅μ‹ μ‹œ 주의 : Javascript 와 같이 λΆ€λ™μ†Œμˆ˜μ  μˆ«μžμ²΄κ³„λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 경우, 2의 53승 μ΄μƒμ˜ μ •μˆ˜λ₯Ό κ·Όμ‚¬κ°’μœΌλ‘œ μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— μ£Όμ˜κ°€ ν•„μš”ν•˜λ‹€. λ¬Έμžμ—΄λ‘œ μ£Όκ³  λ°›λŠ” λ“±μ˜ 처리둜 ν•΄κ²° κ°€λŠ₯ν•˜λ‹€.

Usage

SnowflakeIdGenerator λŠ” μ‚¬μš©ν•˜λŠ” application μ—μ„œ singleton instance 둜 생성해야 ν•œλ‹€.

SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(0);
idGenerator.nextId();

About

Java distributed Unique ID generator inspired by Twitter snowflake.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages