[์ํฐํด ๋ฆฌ๋ทฐ] Love Sharma ์ 7 Famous Approaches to Generate Distributed ID with Comparison Table
ํด๋น ๊ธ์ ๊ฐ๋ฐ, ๊ธฐ์ ๊ด๋ จ ์ํฐํด์ด๋ ๋ธ๋ก๊ทธ ๊ธ ํน์ ์ ํ๋ธ ์์์ ๋ด์ฉ์ ์ ๋ฆฌํ๊ฑฐ๋ ํ๊ธฐ๋ฅผ ์ ๋ ๊ธ์ ๋๋ค.
๋ฆฌ๋ทฐํ ๊ธ: 'Love Sharma ์ ๋ธ๋ก๊ทธ devgenius.io' ์ '7 Famous Approaches to Generate Distributed ID with Comparison Table'
์ฃผ์ ์ ๊ฐ๋จ ์์ฝ
- 2๊ฐ์ง์ ์ ํต์ ์ธ id ์์ฑ ๊ธฐ๋ฒ.
- ๋๊ฐ์ง ๋ฐฉ๋ฒ
- ๋ฐฉ๋ฒ 1. call ๋ง๋ค shared counter ๋ฅผ ์ด์ฉํด์ id ๋ฅผ ์์ฑ
- ๋ฐฉ๋ฒ 2. timestamp ํจ์๋ฅผ ์ด์ฉํด์ id ์์ฑ
- ๋จ์
- ์ฌ๋ฌ ๋ ๋ฆฝ ์๋ฒ์์ ๋์ผํ id ๋ฅผ ์์ฑํ ์ ์์
- ๋จ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด์๋
- ๋ถ์ฐ ํ๊ฒฝ์์๋ ์ ์ผํ id ๋ฅผ ์์ฑํ ์ ์์ด์ผํจ
- High Concurrent Request per Second ๋ฅผ ๋ค๋ฃฐ ์ ์์ด์ผ ํจ
- ๋๊ฐ์ง ๋ฐฉ๋ฒ
- ๋ถ์ฐ id ์์ฑ๊ธฐ๊ฐ ํ์ํ ๊ณณ
- ํต๊ณ ์์ง ์ฅ์น
- ์ฑํ , messaging
- ๋ถ์ฐ ID ์์ฑ๊ธฐ์ ๋ํ ์๊ตฌ์ฌํญ
- Functional Requirements
- 64bit ์ธ์ ๋ฆฌ์ ๊ธธ์ด
- ํด๋ฌ์คํฐ ์ ์ฝ ์์ด ์์ฐจ์ ์ธ unique id ์์ฑ
- ์ด๋น 10,000 ๊ฐ ์ด์์ id ๋ฅผ ์์ฑ
- Non-Functional Requirements
- High Performance
- Low Latency including Geo-Latency
- High Availability
- Fault-Tolerant
- Functional Requirements
- 7๊ฐ์ ๋ํ์ ์ธ ๋ถ์ฐ id ์์ฑ๊ธฐ
- UUID/GUID
- ๊ฐ์ฅ ์ ์๋ ค์ง ์ฌ์ด id ์์ฑ๊ธฐ
- 128๋นํธ์ 16์ง์ ์ซ์, 32 ๋ฌธ์
- 8-4-4-4-12
- MySQL: Centralizing Auto-Increments
- flickr's ticketing service ๋ผ๊ณ ๋ ๋ถ๋ฆผ
- id ์์ฑ๋ง์ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- auto-increment ์ replace into ๋ฌธ์ ์ด์ฉ
- MySQL: Cluster Mode
- ์์ ๋ฐฉ๋ฒ์์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ถ๊ฐํ ๋ฐฉ๋ฒ
- ๋ ๊ฐ์ MySQL ์ธ์คํด์ค๊ฐ ๊ฐ๋ณ์ ์ผ๋ก auto-increment ๋ฅผ ์ฌ์ฉํจ
- MongoDB
- mongoDB ๊ฐ ์์ฒด์ ์ผ๋ก ์ฌ์ฉํ๋ id ์์ฑ๊ธฐ๋ฒ
- 96 bit ์ซ์
- 4(timestamp)-5(random)-3(incrementing counter)
- Twitter Snowflake
- time based generation
- 64 bit ์ unsigned integers ๋ฅผ ์ด์ฉํ unique id ์์ฑ๊ธฐ
- 41(epoch timestamp in millisec)-10(machine/node/shard id)-12(seq, local counter per machine)
- epoch timestamp ๋ก ์ธํด์ time sortable, ๊ฑฐ์น ์ ๋ ฌ์ด ๊ฐ๋ฅํจ
- Baidu UID Generator
- snowflake ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ฆ
- snowflake ์ ๋ฌ๋ฆฌ workID bit ๋ฅผ client ๊ฐ override ํ ์ ์์
- snowflake ์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
- worker node table ์ ์ด์ฉํด์ ์ค์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์์
- snowflake ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ฆ
- Sonyflake
- 39(timeunit)-8(seq)-16(machine id)
- snowflake ๋ฅผ ๋ณด์ํจ
- snowflake ์ ๋นํด์ ์ฅ์ ๊ณผ ๋จ์ ์ด ์์
- snowflake ๋ณด๋ค ๋ ๊ธด lifetime
- ๋ ๋ง์ distributed machines ๋ฅผ ํ์ฉ
- ๋ ๋๋ฆผ
- UUID/GUID
๋ฆฌ๋ทฐ์ ๋์ ํด์
ํ์ฌ ์ผ์ ์ ์ธํ๊ณ ์๋ง ๊ทผ ์์ผ๋์ ๊ฐ์ฅ ๊ด์ฌ์๊ฒ ์์ ์ ํ ๋ถ์ผ๊ฐ ๋ฐ๋ก distributed system id generation ์ผ ๊ฒ์ด๋ค.
๊ทธ๋ฐ ์๋ฏธ์์ ์ด ๊ธ์ ์ฝ์ ๋ ๊ต์ฅํ ์ฌ๋ฐ๊ฒ ์ฝ์๋ค
์ฐ์ , snowflake ์ ๋ํด์๋ ๋น์ฐํ ํฅ๋ฏธ๋ก์ ์ง๋ง MySQL ์ Centralizing ์ ์ด์ฉํ ๋ฐฉ๋ฒ๊ณผ cluster mode ์ด ์ ๋ง ํฅ๋ฏธ๋ก์ ๋ค.
MySQL ์ replace into ๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ผ๋ก ๋ง์ฝ sameID ๊ฐ ์กด์ฌํ๋ค๋ฉด REPLACE INTO
๋ฅผ ํตํด์ id ๋ฅผ ์์ฑํ๋ค๋ ์ปจ์
์ด๋ค.
์ด์ธ์๋ snowflake ๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ฒช์๋ ์ฌ๋ฌ๊ฐ์ง ๋ถํธํ ์ ๋ค์ด ์์๋๋ฐ
- 64 bit ๋ผ๋ ๋๋ฌด ๊ธด ๋ฌธ์์ด
- ์ฝ๊ฒ ๋๋ฌ๋์ง ์๋ machineId ์ ๋ํ ์ ๋ณด
- spof
์ด๋ฌํ ๊ฒ๋ค์ Baidu ์ Sonyflake ๋ฅผ ์ด์ฉํด์ ์ด๋์ ๋ ๋ณด์ํ ์ ์๋ค๋ ์ฌ์ค์ด ๊ฝค๋ ์ค์ํ ์ ๋ณด์๋ค