ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
Dunena Update: What Happened After I Over-Engineered My First Project ๐Ÿ˜…
Dev.toDev.to
Database

Zig ๊ธฐ๋ฐ˜ Hybrid Cache ์—”์ง„ Dunena v0.3.1์˜ ์•„ํ‚คํ…์ฒ˜ ๊ณ ๋„ํ™”

Dunena Update: What Happened After I Over-Engineered My First Project ๐Ÿ˜…

Owen2026๋…„ 5์›” 10์ผ8๋ถ„advanced

Context

์ดˆ๊ธฐ Zig์™€ TypeScript ๊ธฐ๋ฐ˜์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์บ์‹œ ์—”์ง„์—์„œ ๋ฐœ์ƒํ•œ ๊ธฐ๋Šฅ์  ์ œ์•ฝ๊ณผ ๋‹จ์ˆœ LRU ์ •์ฑ…์˜ ํ•œ๊ณ„๋ฅผ ๋ถ„์„. ๋‹จ์ผ Writer ์‹œ์Šคํ…œ์ธ SQLite ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์—์„œ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ œ ์ง๋ฉด.

Technical Solution

  • Recency์™€ Frequency๋ฅผ ์ž๋™ ์กฐ์ •ํ•˜๋Š” ARC(Adaptive Replacement Cache) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ Zig Core์— ๊ตฌํ˜„ํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ๋ณ„ ์ตœ์  ์บ์‹ฑ ์ˆ˜ํ–‰
  • GET-Increment-SET ๊ณผ์ •์˜ Network Round-trip ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด Zig Core ๋ ˆ๋ฒจ์˜ Native Atomic Operations(INCR, DECR, CAS) ๋„์ž…
  • Write-through Replication ๊ตฌ์กฐ ์„ค๊ณ„๋ฅผ ํ†ตํ•œ Primary-Secondary ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฐ Hot Standby ๊ฐ€์šฉ์„ฑ ํ™•๋ณด
  • Dynamic Import ํŒจํ„ด์„ ์ ์šฉํ•œ Database Proxy Connector ํ™•์žฅ์„ ํ†ตํ•ด MongoDB, Redis, Elasticsearch ์ง€์› ๋ฐ ์ข…์†์„ฑ ์ตœ์ ํ™”
  • SQLite WAL mode ํ™œ์šฉ๊ณผ In-memory Zig Cache์˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•œ ์ฝ๊ธฐ ์„ฑ๋Šฅ์˜ ์ˆ˜ํ‰์  ํ™•์žฅ ๊ตฌ์กฐ ์„ค๊ณ„
  • ReleaseSafe ๋นŒ๋“œ ์˜ต์…˜์„ ํ†ตํ•œ Bounds Checking ์œ ์ง€๋กœ Undefined Behavior ๋ฐฉ์ง€ ๋ฐ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ๊ฐ•ํ™”

1. ์บ์‹œ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ์ • ์‹œ ์›Œํฌ๋กœ๋“œ ํŠน์„ฑ์— ๋”ฐ๋ผ LRU/LFU ๋Œ€์‹  ARC ๋„์ž… ๊ฒ€ํ† 

2. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์‹œ Race Condition ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด CAS(Compare-and-Swap) ๊ธฐ๋ฐ˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ์ ์šฉ

3. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ์ฆ๊ฐ€๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด Dynamic Import ๊ธฐ๋ฐ˜์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜ ๊ณ ๋ ค

4. ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋‹จ๊ณ„์—์„œ๋„ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์„ ์œ„ํ•ด Bounds Checking์ด ํฌํ•จ๋œ ๋นŒ๋“œ ํ”„๋กœํŒŒ์ผ ์œ ์ง€

์›๋ฌธ ์ฝ๊ธฐ