ΠΠ°ΡΠ΅ΠΌ CRDT ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΎΠ±ΡΡΠ½ΡΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π΄Π°Π½Π½ΡΡ
CRDT (Conflict-free Replicated Data Types) β ΡΡΠΎ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΡΠ·Π»Π°ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ ΡΠ΅ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΡ ΠΎΠ΄ΠΈΡΡΡΡ ΠΊ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π±Π΅Π· ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΎΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π² offline-first ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ , ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ², ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΊΡΡΠ°Ρ ΠΈ edge-ΡΡΠ΅Π½Π°ΡΠΈΡΡ , Π³Π΄Π΅ ΡΠ΅ΡΡ Π½Π΅Π½Π°Π΄ΡΠΆΠ½Π°.
ΠΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½Π°Ρ ΠΏΡΠΈΡΠΎΠ΄Π° CRDT Π΄Π΅Π»Π°Π΅Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΡ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΡΠ΅ΠΌ Ρ CRUD-ΡΠ΅ΡΠ²ΠΈΡΠ° Ρ ΠΎΠ΄Π½ΠΎΠΉ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ . ΠΡΠΈΠ±ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΡΠ²ΠΈΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ΅ΡΠΈ, ΡΠ°ΡΡΠΈΡΠ½ΠΎΠΉ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΠ΅Π· ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ Π²Ρ ΡΠΈΡΠΊΡΠ΅ΡΠ΅ Π²ΡΠΏΡΡΡΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Β«ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΒ», Π½ΠΎ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΡΠ΅Ρ ΠΏΡΠ°Π²ΠΊΠΈ ΠΈΠ»ΠΈ ΡΠ°ΡΡ ΠΎΠ΄ΠΈΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ.
ΠΠΈΠΆΠ΅ β ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ CRDT-ΡΠΈΡΡΠ΅ΠΌ: ΠΎΡ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ Π΄ΠΎ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΡΡΠΈ.
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ CRDT
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ CRDT Π½ΡΠΆΠ½ΠΎ Π½Π° ΡΡΡΡ ΡΡΠΎΠ²Π½ΡΡ : ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ , ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ²Π΅ΡΡ CRDT. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ Π»ΠΎΠ²ΠΈΡ ΡΠ²ΠΎΠΉ ΠΊΠ»Π°ΡΡ Π΄Π΅ΡΠ΅ΠΊΡΠΎΠ².
Π‘Π²ΠΎΠΉΡΡΠ²Π° ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ CRDT (G-Counter, PN-Counter, LWW-Register, OR-Set, RGA Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ° ΠΈ Ρ.Π΄.) ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅:
- ΠΠΎΠΌΠΌΡΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ merge: ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ»ΠΈΡΠ½ΠΈΡ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π²Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ.
- ΠΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ: merge(A, merge(B, C)) ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ΅Π½ merge(merge(A, B), C).
- ΠΠ΄Π΅ΠΌΠΏΠΎΡΠ΅Π½ΡΠ½ΠΎΡΡΡ: ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π½Π΅ ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
- ΠΠΎΠ½ΠΎΡΠΎΠ½Π½ΠΎΡΡΡ: ΠΏΠΎΡΠ»Π΅ merge Π½ΠΈ ΠΎΠ΄Π½Π° ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄ΡΠ½Π½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π΅ ΠΈΡΡΠ΅Π·Π°Π΅Ρ.
Property-based ΡΠ΅ΡΡΡ (Hypothesis, fast-check) Π±ΡΡΡΡΠΎ Π½Π°Ρ ΠΎΠ΄ΡΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ unit-ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡ.
Π‘ΠΈΠΌΡΠ»ΡΡΠΈΡ ΡΠ΅ΡΠΈ ΠΈ ΡΠΎΠΏΠΎΠ»ΠΎΠ³ΠΈΠΈ
Unit-ΡΠ΅ΡΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½Ρ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΈΠΌΡΠ»ΡΡΠΎΡΡ Ρ:
- ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΠΎΡΠ΅ΡΠ΅ΠΉ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²;
- ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΠΈ (partition) ΠΌΠ΅ΠΆΠ΄Ρ Π³ΡΡΠΏΠΏΠ°ΠΌΠΈ ΡΠ·Π»ΠΎΠ²;
- ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΡΠ·Π»Π° Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΆΡΡΠ½Π°Π»ΠΎΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ;
- Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π²ΡΠΎΠ΄Π΅ Jepsen ΠΈΠ»ΠΈ fuzz-ΡΠ΅ΡΡΡ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΡ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΠ΅Π΄ΠΊΠΈΠ΅ ΡΠ±ΠΎΠΈ Π΄ΠΎ ΡΠ΅Π»ΠΈΠ·Π°.
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠΎΠ²Π΅ΡΡ CRDT ΠΎΠ±ΡΡΠ½ΠΎ ΡΡΡΠΎΠΈΡΡΡ UX: ΡΠΏΠΈΡΠΊΠΈ Π·Π°Π΄Π°Ρ, ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΡ. ΠΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΡΠΊΠ²ΠΎΠ·Π½ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ:
- Π΄Π²Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎΡΠ»Π°ΠΉΠ½ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΡΡΡ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ»Π΅, Π·Π°ΡΠ΅ΠΌ ΠΎΠ±Π° Π²ΡΡ ΠΎΠ΄ΡΡ Π² ΡΠ΅ΡΡ;
- ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² OR-Set;
- ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡ LWW-register ΠΏΡΠΈ Π±Π»ΠΈΠ·ΠΊΠΈΡ timestamp ΠΈ ΡΠ°Π·Π½ΡΡ ΡΠ°ΡΠ°Ρ ΡΡΡΡΠΎΠΉΡΡΠ²;
- ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ ΡΡ Π΅ΠΌΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ ΡΡΠ°ΡΡΡ ΡΠ΅ΠΏΠ»ΠΈΠΊ.
Π€ΠΈΠΊΡΠΈΡΡΠΉΡΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ: Β«ΠΏΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΡΡ ΠΌΠ΅ΡΠΊΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Ρ tie-break ΠΏΠΎ nodeIdΒ» β ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ.
ΠΡΠ»Π°Π΄ΠΊΠ° CRDT Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈ Π½Π° ΠΏΡΠΎΠ΄Π΅
ΠΠΎΠ³Π΄Π° ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΠ»ΠΈ, Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π²ΠΈΠ΄ΡΡ ΡΠ°ΡΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ, Π½ΡΠΆΠ½Π° Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΠΎΡΡΡ, Π·Π°ΡΠΎΡΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ΄ CRDT, Π° Π½Π΅ ΠΎΠ±ΡΠΈΠΉ APM.
Π‘ΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
ΠΠΎΠ³ΠΈΡΡΠΉΡΠ΅ ΠΊΠ°ΠΆΠ΄ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Ρ ΠΏΠΎΠ»ΡΠΌΠΈ: replicaId, lamport/vector clock, ΡΠΈΠΏ CRDT, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, Ρ Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΡΠ»Π΅ apply. ΠΡΠΈ merge β Π²Ρ ΠΎΠ΄ΡΡΠΈΠΉ payload, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ merge ΠΈ diff ΠΏΠΎ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ offline Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΠΏΠΎΠ½ΡΡΡ, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΡΠ°Π³Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ°Π·ΠΎΡΠ»ΠΈΡΡ.
Π‘Π½ΠΈΠΌΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ Β«time travelΒ»
Π dev-ΡΠ±ΠΎΡΠΊΠ°Ρ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠΉΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ CRDT ΠΈ ΠΆΡΡΠ½Π°Π» ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π² JSON Π΄Π»Ρ ΡΡΡΠ½ΠΎΠ³ΠΎ merge ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠ·Π»ΠΎΠ².
ΠΠ΅ΡΡΠΈΠΊΠΈ ΡΠ°ΡΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ
ΠΠ° ΠΏΡΠΎΠ΄Π΅ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΠΉΡΠ΅ Ρ Π΅ΡΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΈ Π²ΡΠ±ΠΎΡΠΊΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² (Ρ ΡΠΎΠ³Π»Π°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π² Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅). Π ΠΎΡΡ ΡΠΈΡΠ»Π° Β«repair syncΒ» ΠΈΠ»ΠΈ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Π½ΡΡ full resync β ΡΠ°Π½Π½ΠΈΠΉ ΡΠΈΠ³Π½Π°Π» ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠΈ Π² merge-Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΈΠ»ΠΈ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅.
Π’ΠΈΠΏΠΈΡΠ½ΡΠ΅ ΠΊΠΎΡΠ½Π΅Π²ΡΠ΅ ΠΏΡΠΈΡΠΈΠ½Ρ Π±Π°Π³ΠΎΠ²
- ΠΠ΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ (JSON key order, float precision, undefined vs null).
- Π§Π°ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²: LWW Π±Π΅Π· Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ°ΡΠΎΠ² ΠΈΠ»ΠΈ Π±Π΅Π· tie-break.
- Tombstone GC ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ°Π½ΠΎ ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅, Π½ΡΠΆΠ½ΡΠ΅ Π΄Π»Ρ merge.
- Π‘ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ CRDT ΠΈ imperative-ΠΏΠ°ΡΡΠ΅ΠΉ ΠΏΠΎΠ²Π΅ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.
- Π Π°Π·Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ CRDT Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ΅.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ ΡΠΈΠΏ CRDT ΠΈ Π²Π΅ΡΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ·Π»Π΅. ΠΠΎΠ»Π΅Π·Π½Ρ deterministic seed Π΄Π»Ρ ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠ°, contract tests ΡΠΎΡΠΌΠ°ΡΠ° delta ΠΈ regression corpus ΠΈΠ· JSON Π±Π°Π³ΠΎΠ² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π°.
ΠΠ°ΡΠ½ΠΈΡΠ΅ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ (OR-Set ΠΈΠ»ΠΈ LWW), ΠΏΠΎΠΊΡΠΎΠΉΡΠ΅ property-ΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΈ ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠΎΠΌ partition, Π·Π°ΡΠ΅ΠΌ ΡΠ°ΡΡΠΈΡΡΠΉΡΠ΅ ΠΌΠΎΠ΄Π΅Π»Ρ.
ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠ²Π»Π΅ΠΊΠ°ΡΡ Π²Π½Π΅ΡΠ½ΡΡ ΡΠΊΡΠΏΠ΅ΡΡΠΈΠ·Ρ
CRDT ΠΎΠΏΡΠ°Π²Π΄Π°Π½Ρ ΡΠ°ΠΌ, Π³Π΄Π΅ offline ΠΈ Π½ΠΈΠ·ΠΊΠ°Ρ Π·Π°Π΄Π΅ΡΠΆΠ½ΠΎΡΡΡ Π²Π°ΠΆΠ½Π΅Π΅ ΡΡΡΠΎΠ³ΠΎΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ. ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΏΡΠΎΠ΄ΡΠΊΡ β ΠΏΡΠΎΡΡΠΎΠΉ CRUD Ρ ΡΠ΅Π΄ΠΊΠΈΠΌΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ°ΠΌΠΈ, ΠΈΠ½ΠΎΠ³Π΄Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ optimistic locking ΠΈ last-write-wins Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅.
Π‘ΡΠΎΠΈΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ Π·Π° ΠΊΠΎΠ½ΡΡΠ»ΡΡΠ°ΡΠΈΠ΅ΠΉ, Π΅ΡΠ»ΠΈ: ΡΠ°ΡΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΡΡ Π½Π΅ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎ ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΡΡ ΡΠ΅Π»ΠΈΠ·; ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠΌΠ΅ΡΠ°Π»Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ CRDT-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ; Π½ΡΠΆΠ΅Π½ Π°ΡΠ΄ΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅Π΄ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ; ΠΈΠ»ΠΈ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Ρ operational transform Π½Π° CRDT Π±Π΅Π· ΠΏΡΠΎΡΡΠΎΡ.
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π΄Π°Π½Π½ΡΡ β Π² ΡΠ°Π·Π΄Π΅Π»Π΅ ΡΡΠ»ΡΠ³ ΠΏΠΎ CRDT.
Π§Π΅ΠΊ-Π»ΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½ΠΎΠΌ Ρ CRDT
ΠΠ΅ΡΠ΅Π΄ Π²ΡΠΊΠ»Π°Π΄ΠΊΠΎΠΉ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ Π΅ΡΡΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ°Π·ΡΡΠ²Π°: ΠΊΠ»ΠΈΠ΅Π½Ρ A ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ B ΠΏΡΠ°Π²ΡΡ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ offline, Π·Π°ΡΠ΅ΠΌ ΠΎΠ±Π° Π²ΡΡ ΠΎΠ΄ΡΡ online Π² ΡΠ°Π·Π½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅. ΠΠ°ΡΠΈΠΊΡΠΈΡΡΠΉΡΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ merge Π² ΡΠΈΠΊΡΡΡΡΠ΅ ΠΈ Π³ΠΎΠ½ΡΠΉΡΠ΅ Π΅Π³ΠΎ Π² CI Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠΌΠΈΡΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΎΠ³Π°Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ.
ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΈΠ΄Π΅ΠΌΠΏΠΎΡΠ΅Π½ΡΠ½ΠΎΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ: ΠΏΠΎΠ²ΡΠΎΡΠ½Π°Ρ Π΄ΠΎΡΡΠ°Π²ΠΊΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ°Π·Π΄ΡΠ²Π°ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠΎΠ³ΠΈΡΡΠΉΡΠ΅ Π²Π΅ΠΊΡΠΎΡΠ½ΡΠ΅ ΡΠ°ΡΡ ΠΈΠ»ΠΈ version vectors ΡΡΠ΄ΠΎΠΌ Ρ payload β Π±Π΅Π· ΡΡΠΎΠ³ΠΎ ΠΎΡΠ»Π°Π΄ΠΊΠ° Β«ΠΏΠΎΡΠ΅ΠΌΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ ΡΡΠ°Π» ΡΠ°ΠΊΠΈΠΌΒ» ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² Π³Π°Π΄Π°Π½ΠΈΠ΅.
- Property-based ΡΠ΅ΡΡΡ Π½Π° ΠΊΠΎΠΌΠΌΡΡΠ°ΡΠΈΠ²Π½ΠΎΡΡΡ ΠΈ ΠΈΠ΄Π΅ΠΌΠΏΠΎΡΠ΅Π½ΡΠ½ΠΎΡΡΡ merge
- Π‘ΠΈΠΌΡΠ»ΡΡΠΈΡ partition Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
- ΠΠ΅ΡΡΠΈΠΊΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ merge Π½Π° Β«Π³ΠΎΡΡΡΠΈΡ Β» Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°Ρ
- Π―Π²Π½Π°Ρ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° tombstone/GC, ΡΡΠΎΠ±Ρ ΠΈΡΡΠΎΡΠΈΡ Π½Π΅ ΡΠΎΡΠ»Π° Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ
Π’ΠΈΠΏΠΈΡΠ½ΡΠ΅ Π»ΠΎΠ²ΡΡΠΊΠΈ ΠΏΡΠΈ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠΈ
Π§Π°ΡΡΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ° β ΡΠΌΠ΅ΡΠΈΠ²Π°ΡΡ CRDT Ρ Β«ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π·Π°ΠΏΠΈΡΡ ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅ΡΒ» Π±Π΅Π· ΡΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°. ΠΡΡΠ³Π°Ρ β ΡΠ°ΡΠΈΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΊΡΡΠΏΠ½ΡΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ: ΡΡΠΎΠΈΠΌΠΎΡΡΡ sync ΡΠ°ΡΡΡΡ Π±ΡΡΡΡΠ΅Π΅, ΡΠ΅ΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π° happy-path. Π’ΡΠ΅ΡΡΡ β ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ happy-path Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅, Π±Π΅Π· Π΄Π²ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΡΠ΅ΠΏΠ»ΠΈΠΊ.
ΠΡΠ»ΠΈ Π²Ρ ΡΡΡΠΎΠΈΡΠ΅ collaborative editor, ΡΠ°ΡΡ ΠΈΠ»ΠΈ offline-first mobile, Π·Π°Π»ΠΎΠΆΠΈΡΠ΅ Π±ΡΠ΄ΠΆΠ΅Ρ Π½Π° observability: Π±Π΅Π· ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π²Ρ Π½Π΅ ΠΎΡΠ»ΠΈΡΠΈΡΠ΅ Π±Π°Π³ merge ΠΎΡ Π±Π°Π³Π° UI. ΠΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» Π²ΡΠ½Π΅ΡΡΠΈ CRDT-ΡΠ»ΠΎΠΉ Π·Π° ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΉ API ΠΈ ΠΏΠΎΠΊΡΡΡΡ Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ½ΡΠΌΠΈ ΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΎΡ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π°.
ΠΠ°ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΡΡ ΠΊΠΎΠ½ΡΡΠ»ΡΡΠ°ΡΠΈΡ.




