์Šน๋Œ ์“ฐ๋‹ค

Instagram ID ์ƒค๋”ฉ ์ „๋žต์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž.

seungdols 2025. 12. 8. 10:43
Instagram ID ์ƒค๋”ฉ ์ „๋žต ์‹œ๊ฐํ™”

๐Ÿ“ธ Instagram ID ์ƒค๋”ฉ ์ „๋žต

Instagram์ด ๋Œ€๊ทœ๋ชจ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๊ณ ์œ ํ•œ ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿ”ข 64๋น„ํŠธ ID ๊ตฌ์กฐ

Timestamp
41 bits
๋ฐ€๋ฆฌ์ดˆ ํƒ€์ž„์Šคํƒฌํ”„
Shard ID
13 bits
์ƒค๋“œ ์‹๋ณ„์ž
Sequence
10 bits
์ž๋™ ์ฆ๊ฐ€ ์‹œํ€€์Šค
๋ถ€๋ถ„ ๋น„ํŠธ ์ˆ˜ ์ตœ๋Œ€ ๊ฐ’ ์„ค๋ช…
ํƒ€์ž„์Šคํƒฌํ”„ 41 bits 2^41 โ‰ˆ 69๋…„ ์ปค์Šคํ…€ epoch ์ดํ›„์˜ ๋ฐ€๋ฆฌ์ดˆ. ์‹œ๊ฐ„ ์ˆœ ์ •๋ ฌ ๊ฐ€๋Šฅ
์ƒค๋“œ ID 13 bits 2^13 = 8,192 ๋…ผ๋ฆฌ์  ์ƒค๋“œ ์‹๋ณ„. ๋ฐ์ดํ„ฐ ์œ„์น˜ ๊ฒฐ์ •
์‹œํ€€์Šค 10 bits 2^10 = 1,024 ์ƒค๋“œ๋‹น ๋ฐ€๋ฆฌ์ดˆ๋‹น 1,024๊ฐœ ID ์ƒ์„ฑ ๊ฐ€๋Šฅ

๐Ÿ—๏ธ ์ƒค๋”ฉ ์•„ํ‚คํ…์ฒ˜

๋…ผ๋ฆฌ์  ์ƒค๋“œ

Shard 1
Shard 2
Shard 3
...
Shard 2000

์ˆ˜์ฒœ ๊ฐœ์˜ ๋…ผ๋ฆฌ์  ์ƒค๋“œ

โŸน

๋ฌผ๋ฆฌ์  ์„œ๋ฒ„

PostgreSQL ์„œ๋ฒ„ 1
Schema 1, 2, 3...
PostgreSQL ์„œ๋ฒ„ 2
Schema 500, 501...
PostgreSQL ์„œ๋ฒ„ 3
Schema 1000, 1001...

์ ์€ ์ˆ˜์˜ ๋ฌผ๋ฆฌ์  ์„œ๋ฒ„

ํ•ต์‹ฌ ์•„์ด๋””์–ด: ๋…ผ๋ฆฌ์  ์ƒค๋“œ๋ฅผ ์ฝ”๋“œ์—์„œ ๋ฌผ๋ฆฌ์  ์„œ๋ฒ„๋กœ ๋งคํ•‘. ๋ฐ์ดํ„ฐ ์žฌ๊ตฌ์„ฑ ์—†์ด ์ƒค๋“œ๋ฅผ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์‰ฝ๊ฒŒ ์ด๋™ ๊ฐ€๋Šฅ!

๐Ÿ“ ID ์ƒ์„ฑ ์˜ˆ์ œ

์‹œ๋‚˜๋ฆฌ์˜ค

  • ๋‚ ์งœ: 2011๋…„ 9์›” 9์ผ ์˜คํ›„ 5์‹œ
  • Epoch: 2011๋…„ 1์›” 1์ผ
  • ์‚ฌ์šฉ์ž ID: 31,341
  • ๋…ผ๋ฆฌ์  ์ƒค๋“œ ๊ฐœ์ˆ˜: 2,000๊ฐœ
1 ํƒ€์ž„์Šคํƒฌํ”„ ๊ณ„์‚ฐ
Epoch ์ดํ›„ ๊ฒฝ๊ณผ ์‹œ๊ฐ„: 1,387,263,000 ๋ฐ€๋ฆฌ์ดˆ ์™ผ์ชฝ 23๋น„ํŠธ ์‹œํ”„ํŠธ: 1387263000 << 23 ๊ฒฐ๊ณผ: ์ตœ์ƒ์œ„ 41๋น„ํŠธ ์ฑ„์šฐ๊ธฐ
2 ์ƒค๋“œ ID ๊ณ„์‚ฐ
์‚ฌ์šฉ์ž ID๋กœ ์ƒค๋”ฉ: 31341 % 2000 = 1341 ์™ผ์ชฝ 10๋น„ํŠธ ์‹œํ”„ํŠธ: 1341 << 10 ๊ฒฐ๊ณผ: ๋‹ค์Œ 13๋น„ํŠธ ์ฑ„์šฐ๊ธฐ
3 ์‹œํ€€์Šค ๋ฒˆํ˜ธ ์ถ”๊ฐ€
PostgreSQL nextval() ํ˜ธ์ถœ ์‹œํ€€์Šค ๊ฐ’ % 1024 ๊ฒฐ๊ณผ: ๋งˆ์ง€๋ง‰ 10๋น„ํŠธ ์ฑ„์šฐ๊ธฐ
4 ์ตœ์ข… ID ์กฐํ•ฉ
ID = (timestamp << 23) | (shard_id << 10) | (sequence % 1024) ๊ฒฐ๊ณผ: 64๋น„ํŠธ ๊ณ ์œ  ID ์ƒ์„ฑ ์™„๋ฃŒ!

๐Ÿ’ป PostgreSQL ๊ตฌํ˜„

CREATE OR REPLACE FUNCTION insta5.next_id(OUT result bigint) AS $$ DECLARE our_epoch bigint := 1314220021721; -- ์ปค์Šคํ…€ epoch seq_id bigint; now_millis bigint; shard_id int := 5; -- ํ˜„์žฌ ์ƒค๋“œ ID BEGIN -- 1. ์‹œํ€€์Šค ๋ฒˆํ˜ธ ๊ฐ€์ ธ์˜ค๊ธฐ (1024๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€) SELECT nextval('insta5.table_id_seq') % 1024 INTO seq_id; -- 2. ํ˜„์žฌ ๋ฐ€๋ฆฌ์ดˆ ํƒ€์ž„์Šคํƒฌํ”„ SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis; -- 3. ID ์กฐํ•ฉ result := (now_millis - our_epoch) << 23; -- ํƒ€์ž„์Šคํƒฌํ”„ result := result | (shard_id << 10); -- ์ƒค๋“œ ID result := result | (seq_id); -- ์‹œํ€€์Šค END; $$ LANGUAGE PLPGSQL;

โœจ ์ฃผ์š” ์žฅ์ 

โฐ ์‹œ๊ฐ„ ์ˆœ ์ •๋ ฌ

ID์— ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด ์ถ”๊ฐ€ ์ฟผ๋ฆฌ ์—†์ด ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ ๊ฐ€๋Šฅ

๐ŸŽฏ ์ƒค๋“œ ์‹๋ณ„

ID์—์„œ ์ƒค๋“œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์–ด๋А DB๋ฅผ ์ฟผ๋ฆฌํ• ์ง€ ์ฆ‰์‹œ ํŒŒ์•…

๐Ÿš€ ๋‹จ์ˆœ์„ฑ

๋ณ„๋„์˜ ID ์ƒ์„ฑ ์„œ๋น„์Šค ๋ถˆํ•„์š”. PostgreSQL ๋‚ด๋ถ€์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌ

๐Ÿ“ˆ ํ™•์žฅ์„ฑ

๋ฐ์ดํ„ฐ ์žฌ๊ตฌ์„ฑ ์—†์ด ๋…ผ๋ฆฌ์  ์ƒค๋“œ๋ฅผ ์ƒˆ ์„œ๋ฒ„๋กœ ์ด๋™ ๊ฐ€๋Šฅ

โšก ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰

์ƒค๋“œ๋‹น ๋ฐ€๋ฆฌ์ดˆ๋‹น 1,024๊ฐœ ID ์ƒ์„ฑ. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋กœ ์ „์ฒด ์ฒ˜๋ฆฌ๋Ÿ‰ ๊ทน๋Œ€ํ™”

๐Ÿ’พ ํšจ์œจ์  ์ €์žฅ

64๋น„ํŠธ๋กœ ์ปดํŒฉํŠธ. Redis ๋“ฑ์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅ ๊ฐ€๋Šฅ

๐Ÿ” ๋‹ค๋ฅธ ์†”๋ฃจ์…˜๊ณผ์˜ ๋น„๊ต

์†”๋ฃจ์…˜ ํฌ๊ธฐ ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ ๋ณต์žก๋„ Instagram ์„ ํƒ ์—ฌ๋ถ€
UUID 128 bits โŒ ๋‚ฎ์Œ โŒ ๋„ˆ๋ฌด ํผ
Flickr (ํ™€์ˆ˜/์ง์ˆ˜) 64 bits โŒ ์ค‘๊ฐ„ โŒ ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ ๋ถˆ๊ฐ€
Twitter Snowflake 64 bits โœ… ๋†’์Œ โš ๏ธ ๋ณ„๋„ ์„œ๋น„์Šค ํ•„์š”
Instagram ๋ฐฉ์‹ 64 bits โœ… ๋‚ฎ์Œ โœ… ์„ ํƒ!

๐Ÿ“Š ์„ฑ๋Šฅ ์ง€ํ‘œ

์ฒ˜๋ฆฌ๋Ÿ‰ ๊ณ„์‚ฐ

  • ์ƒค๋“œ๋‹น ์ฒ˜๋ฆฌ๋Ÿ‰: 1,024 IDs/๋ฐ€๋ฆฌ์ดˆ = 1,024,000 IDs/์ดˆ
  • 2,000๊ฐœ ๋…ผ๋ฆฌ์  ์ƒค๋“œ: 2,048,000,000 IDs/์ดˆ (์ด๋ก ์  ์ตœ๋Œ€)
  • ์‹ค์ œ Instagram ๋ถ€ํ•˜: ์ดˆ๋‹น ์‚ฌ์ง„ 25๊ฐœ + ์ข‹์•„์š” 90๊ฐœ = 115๊ฐœ/์ดˆ
  • ์—ฌ์œ : ์ด๋ก ์  ์ตœ๋Œ€์น˜์˜ 0.000006% ์‚ฌ์šฉ ์ค‘ (์ถฉ๋ถ„ํ•œ ํ™•์žฅ ์—ฌ๋ ฅ)

๐ŸŽ“ ํ•ต์‹ฌ ๊ตํ›ˆ

  1. ๋‹จ์ˆœํ•จ์ด ์ตœ๊ณ : ๋ณต์žกํ•œ ์™ธ๋ถ€ ์„œ๋น„์Šค ๋Œ€์‹  ๊ธฐ์กด DB ๊ธฐ๋Šฅ ํ™œ์šฉ
  2. ํ˜„๋ช…ํ•œ ์ฐจ์šฉ: Twitter Snowflake ์•„์ด๋””์–ด๋ฅผ ์ฐจ์šฉํ•˜๋˜ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๋ณ€ํ˜•
  3. ๋…ผ๋ฆฌ์  ์ถ”์ƒํ™”: ๋…ผ๋ฆฌ์  ์ƒค๋“œ์™€ ๋ฌผ๋ฆฌ์  ์ƒค๋“œ ๋ถ„๋ฆฌ๋กœ ํ™•์žฅ์„ฑ ํ™•๋ณด
  4. ์Šค์ผ€์ผ๋ง ์ „๋žต: ์ ์€ ์—”์ง€๋‹ˆ์–ด๋กœ 1,400๋งŒ+ ์‚ฌ์šฉ์ž ์ง€์› ๊ฐ€๋Šฅ

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

  • ์›๋ฌธ: Sharding & IDs at Instagram
  • Twitter Snowflake: ๋ถ„์‚ฐ ID ์ƒ์„ฑ ์‹œ์Šคํ…œ์˜ ์˜๊ฐ
  • PostgreSQL Schemas: ๋…ผ๋ฆฌ์  ๊ทธ๋ฃนํ™” ๊ธฐ๋Šฅ
  • PL/PGSQL: PostgreSQL์˜ ๋‚ด์žฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
๋ฐ˜์‘ํ˜•