๋ถ์ฐ ์์คํ ์์ ๊ณ ์ ํ๊ณ ์ ๋ ฌ ๊ฐ๋ฅํ ID ์์คํ
ID ํน์ฑ
์ฑ๋ฅ
ํ๋ก์ธ์ค
์์ฒญ
โ
์ฌ๋ฌ DB ์ค ํ๋ ์ ํ
โ
๊ฐ DB๋ ๊ณ ์ ํ ์ฆ๊ฐ ๊ท์น์ผ๋ก ID ์์ฑ
โโ DB1: ํ์ (1, 3, 5, 7, ...)
โโ DB2: ์ง์ (2, 4, 6, 8, ...)
โ
ID ๋ฐํ
์ฅ์
โ
๊ตฌํ ๊ฐ๋จ
โ
SPOF ํด๊ฒฐ (HA ๊ตฌ์ฑ)
โ
์ฑ๋ฅ ํฅ์ (2๋ฐฐ~N๋ฐฐ)
๋จ์
โ ํ์ฅ์ฑ ์ ํ (Sharding ์ ๋ณต์ก)
โ ์๋ฒฝํ ์๊ฐ์ ์ ๋ ฌ ๋ถ๊ฐ (DB ๊ฐ ํ์ด๋ฐ ์ฐจ์ด)

ํ๋ก์ธ์ค
์์ฒญ
โ
์ค์ ID ์์ฑ ์๋ฒ ํธ์ถ
โ
์์ฐจ์ ID ์์ฑ (INCR ๋๋ Counter)
โ
ID ๋ฐํ
์์
Redis INCR, Atomic Counter, DB Sequence ๋ฑ ์ฌ์ฉ
์ฅ์
โ
๊ตฌํ ๊ฐ๋จ
โ
๋์ ์ฑ๋ฅ (์ ~ ์ค๊ท๋ชจ์ ํ๋ก์ ํธ์ ์ ํฉ)
๋จ์
โ ์ค์ ์๋ฒ SPOF ๊ฐ๋ฅ์ฑ (HA ๊ตฌ์ฑ ํ์)
โ HA ๊ตฌ์ฑ์ ๋ฐ์ดํฐ ๋๊ธฐํ ์์
ํ์
โ ๋๊ท๋ชจ ๋ถ์ฐ ํ๊ฒฝ์์ Network I/O ๋ณ๋ชฉ

ํ๋ก์ธ์ค
์์ฒญ
โ
128๋นํธ ๋๋ค UUID ์์ฑ
โ
ID ๋ฐํ
์ฅ์
โ
๋น ๋ฅธ ์์ฑ ์๋
โ
์ถฉ๋ ํ๋ฅ ๊ทนํ ๋ฎ์
โ
๋คํธ์ํฌ I/O ์์
๋จ์
โ 128๋นํธ (64๋นํธ ์๊ตฌ์ฌํญ ๋ถ์ถฉ์กฑ)
โ ๋ฌธ์์ด ํฌํจ (์ซ์ ์ ์ฉ ์๊ตฌ์ฌํญ ๋ถ์ถฉ์กฑ)
โ ์๊ฐ์ ์ ๋ ฌ ๋ถ๊ฐ
๐ก ํฐ์ผ์๋ฒ์ ์ค์์ง์ค์ ์์ฑ๊ณผ ์์ ํ ๋๋น๋๋ ์๋ ๊ฐ ์๋ฒ ์ธ์คํด์ค์์ ๋ ๋ฆฝ์ ์ผ๋ก ID๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด ์ ๋ต์ ์ฌ์ฉํ๋ฉด Network IO๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ๋ ์๊ตฌ์ฌํญ๋ค์ ์ถฉ์กฑ์ํฌ ์ ์์ต๋๋ค.

Twitter(ํ X)์์ ๋ง๋ ๋ถ์ฐ ํ๊ฒฝ์ฉ ID ์์ฑ ๋ฐฉ์.
64๋นํธ ์ ์ ID๋ฅผ ๊ฐ ์๋ฒ๊ฐ ์์์ ์์ฑ.

๋นํธ๋ณ ๊ตฌ์ฑ
Sign (1๋นํธ):
โโ ํญ์ 0 (์์ ๋ณด์ฅ)
Timestamp (41๋นํธ):
โโ ๋จ์: ๋ฐ๋ฆฌ์ด (ms)
โโ ๊ธฐ์ค: ์ปค์คํ
Epoch (์: 2010-01-01)
โโ ๋ฒ์: 0 ~ 2^41-1 = 2,199,023,255,551 ms
โโ ์๋ช
: ์ฝ 69๋
Machine ID (10๋นํธ):
โโ ๋ฒ์: 0~1,023 (์ต๋ 1,024๋ ์๋ฒ)
โโ ๊ตฌ์ฑ: Datacenter ID (5๋นํธ) + Worker ID (5๋นํธ)
โโ ๋ชฉ์ : ์๋ฒ ๊ฐ ์ถฉ๋ ๋ฐฉ์ง
Sequence (12๋นํธ):
โโ ๋ฒ์: 0~4,095 (๊ฐ์ ms์ ์ต๋ 4,096๊ฐ)
โโ ๋์: ๊ฐ์ ms ๋ด์์ ์์ฐจ ์ฆ๊ฐ
โโ ์ด๊ธฐํ: ์๋ก์ด ms๋ง๋ค 0์ผ๋ก ๋ฆฌ์
ํ๋ก์ธ์ค
์์ฒญ
โ
ํ์ฌ Timestamp + Machine ID + Sequence ์กฐํฉ
โ
64๋นํธ ID ๋ฐํ (๋ก์ปฌ ์์ฑ)
์ฑ๋ฅ
๋จ์ผ ์๋ฒ: 4,096,000 ID/sec
10,000 TPS ์๊ตฌ์ฌํญ: โ
400๋ฐฐ ์ฌ์
์ฅ์
โ
๋ชจ๋ ์๊ตฌ์ฌํญ ์ถฉ์กฑ
โ
์๊ฐ์ ์ ๋ ฌ ๊ฐ๋ฅ
โ
Network I/O ์์ (๋ก์ปฌ ์์ฑ)
โ
๋์ ์ฑ๋ฅ
โ
ํ์ฅ์ฑ ์ฐ์
๋จ์
โ ์๊ณ ๋๊ธฐํ ํ์ (NTP)
โ ์๊ณ ์ญํ ์ฒ๋ฆฌ ํ์
๐ก ํฐ์ผ์๋ฒ์ ์ค์์ง์ค์ ์์ฑ๊ณผ ์์ ํ ๋๋น๋๋ ์๋ ๊ฐ ์๋ฒ ์ธ์คํด์ค์์ ๋ ๋ฆฝ์ ์ผ๋ก ID๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด ์ ๋ต์ ์ฌ์ฉํ๋ฉด Network IO๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ๋ ์๊ตฌ์ฌํญ๋ค์ ์ถฉ์กฑ์ํฌ ์ ์์ต๋๋ค.

๐ก ๊ทธ๋ฆฌ๊ณ snowflake์ ์๋ฆฌ์ธ 64๋นํธ ์ดํด๋ฅผ ํ ๋๋ก ๋นํธ ๋ฐฐ๋ถ์ ์กฐ์ ํ์ฌ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅํฉ๋๋ค ๊ทธ ์๋ก Sonyflake๋ Timestamp๋ฅผ 10ms ๋จ์๋ก ์ ์ฅํ์ฌ snowflake์ 69๋ ๋ณด๋ค ๊ธด ์ฝ 174๋ ์๋ช ํ๋ณดํ์ต๋๋ค.
๊ฐ์ ๋ฉด์ ์ฌ๋ก๋ก ๋ฐฐ์ฐ๋ ๋๊ท๋ชจ ์์คํ
์ค๊ณ ๊ธฐ์ด
Snowflake (GitHub)
Sonyflake (GitHub)
Announcing Snowflake
Krypton (DEV)