БСсплатная ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ†ΠΈΡ

ΠžΠΏΠΈΡˆΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΠ»ΠΈ Ρ†Π΅Π»ΡŒ. ΠžΡ‚Π²Π΅Ρ‡Ρƒ с практичСским ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом β€” бСсплатно, Π±Π΅Π· ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π².

Или Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ врСмя Π² Calendly

Π—Π°Ρ‡Π΅ΠΌ 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 ΠΈ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π½Ρ‹ΠΌΠΈ тСстами ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π°.

Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° Π±Π΅ΡΠΏΠ»Π°Ρ‚Π½ΡƒΡŽ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ†ΠΈΡŽ.