| name | crdt-algorithms |
| description | CRDT-based real-time collaborative text editor implementation guide. Use when the user requests implementing CRDTs, real-time collaboration, conflict resolution, RGA algorithm, or convergent replicated data types. |
CRDT Algorithms Skill
CRDT ๊ธฐ๋ฐ ์ค์๊ฐ ํ์
ํ
์คํธ ์๋ํฐ ๊ตฌํ ๊ฐ์ด๋
RGA ์๋ฃ๊ตฌ์กฐ ๊ฐ์
RGA: ์ฐ๊ฒฐ ๋ฆฌ์คํธ + IDโNode ํด์๋งต
Node: { id: CharId, char: string, deleted: boolean, next: Node }
HEAD: ๋ฌธ์ ์์ ์ผํฐ๋ฌ ๋
ธ๋
- CharId:
(siteId, Lamport clock) ์์ผ๋ก ์ ์ญ ๊ณ ์ ์๋ณ
- ์ญ์ ๋ tombstone (
deleted=true), ์ค์ ์ ๊ฑฐํ์ง ์์
nodeMap์ผ๋ก O(1) ๋
ธ๋ ์กฐํ
์ถฉ๋ ํด๊ฒฐ ๊ท์น (๊ฒฐ์ ๋ก ์ )
- ๋์ ์ฝ์
(๊ฐ์ ์์น):
id.compareTo()๋ก ๊ฒฐ์ . clock ์ฐ์ , ๊ฐ์ผ๋ฉด siteId ์ฌ์ ์
- ์ฝ์
vs ์ญ์ : tombstone ๊ธฐ๋ฐ์ด๋ฏ๋ก ์ญ์ ๋ ๋
ธ๋ ๋ค์ ์ฝ์
๊ฐ๋ฅ
- ๋ฉฑ๋ฑ์ฑ:
nodeMap์ ์ด๋ฏธ ์กด์ฌํ๋ฉด ๋ฌด์ (ID ๊ธฐ๋ฐ ์ค๋ณต ์ฒดํฌ)
์ธ๊ณผ์ฑ ์์น
- Lamport clock:
max(local, received) + 1
- happens-before ๊ด๊ณ ๋ณด์ฅ
- ๋ชจ๋ ์ฌ์ดํธ๊ฐ ๋์ผ ์ฐ์ฐ ์งํฉ์ ์ ์ฉํ๋ฉด ๋์ผ ๊ฒฐ๊ณผ ์๋ ด
ํ์ผ ๊ตฌ์กฐ
src/
char-id.js - ๋ฌธ์ ๊ณ ์ ID (siteId + Lamport clock)
crdt-document.js - CRDT ๋ฌธ์ (RGA ๊ตฌํ)
site.js - ์ฌ์ฉ์ ๋
ธ๋ (๋ก์ปฌ ํธ์ง + ์๊ฒฉ ์ ์ฉ)
simulator.js - ํ์
์๋ฎฌ๋ ์ดํฐ
vector-clock.js - Lamport ๋
ผ๋ฆฌ ์๊ณ
tests/
basic.test.js - ๋จ์ผ ์ฌ์ดํธ ๊ธฐ๋ณธ ์ฐ์ฐ
sync.test.js - 2์ฌ์ดํธ ๋๊ธฐํ (๋น์ถฉ๋)
conflict.test.js - ์ถฉ๋ ์๋๋ฆฌ์ค A/B/C
convergence.test.js - ๋๋ค ์ฐ์ฐ ์๋ ด์ฑ ๊ฒ์ฆ
idempotency.test.js - ๋ฉฑ๋ฑ์ฑ ๊ฒ์ฆ
ํ
์คํธ ์ ๋ต (6๊ฐ์ง)
- ๋จ์ผ ์ฌ์ดํธ: ์ฝ์
/์ญ์ /getText
- 2์ฌ์ดํธ ๋น์ถฉ๋ ๋๊ธฐํ
- ์๋๋ฆฌ์ค A: ๋์ ์ฝ์
๊ฐ์ ์์น โ ๊ฒฐ์ ๋ก ์ ์์
- ์๋๋ฆฌ์ค B: ์ฝ์
vs ์ญ์ ๊ฐ์ ์์น
- ์๋๋ฆฌ์ค C: 3์ฌ์ดํธ ๋ณตํฉ ํธ์ง โ ์๋ ด
- ๋๋ค ํผ์ฆ ํ
์คํธ: Nํ ๋๋ค ์ฐ์ฐ โ syncAll โ ์๋ ด ๊ฒ์ฆ