Conflict-free
Replicated
Data
Types
Юрий Сыровецкий
Проблема: компьютеры обмениваются разными данными
Consistency
Availability
Partition
tolerance
P
C A
C + a
- Деньги
- Правовые документы
- иные критичные к «истине» приложения
- Что угодно, если помещается в ДЦ
- Почти что угодно, если помещается на Земле
A + c
- Совместная работа
- Игры
- Социалочки
- Мобильные приложения
- UI
- Космические системы
Зачем?
- отзывчивость > скорость сети
- сеть разрывается, оффлайн
- исключение узких мест
- многопользовательская система
Зачем нам?
- состояние клиента в Телемосте
- презентация на Хурале («следующий слайд, пожалуйста»)
-
Заметки в Диске
-
автоматическое слияние некоторых типов файлов (текстовых документов, таблиц)
-
Make DataSync Great Again
Задачи, решаемые CRDT
-
синхронизация реплицированных данных
-
без центрального сервера
-
без подтверждения других участников
-
многие ко многим
-
на нестабильных каналах
-
с периодами отсутствия связи
Как решать конфликты?
OT
(Operational Transformation)
Как сделать правильно-то?
Convergent
Replicated
Data
Types
(CvRDT, state-based)
Grow-only counter
Счётчик лайков
Сервера: \(1..n\)
Лайки: \([c_1,..,c_n]\)
Product
Positive/Negative counter
Last Write Wins
Grow-only set
Observed-Remove set
// Rust
type Tag = Timestamp;
type ORSet<T> = Map<Tag, Option<T>>;
Где взять уникальные Tag?
$$\text{LamportTime} = \text{LocalTime} × \text{NodeId}$$
strictly monotonic
unique, ordered
causality:
$$\text{add}(t_i) ≺ \text{remove}(t_i)$$
А строки-то как?
Replicated Growable Array
// Rust
type Tag = Timestamp;
type RGA<T> = Vec<(Tag, Option<T>)>;
Известный писатель, врач и пушкинист Викентий Вересаев вспоминал: «В одной одесской газете при описании коронации – не помню, Александра III или Николая II, – было напечатано:
Митрополит возложил на голову Его Императорского Величества ворону.
В следующем выпуске газеты якобы появилась заметка:
В предыдущем номере нашей газеты, в отчёте о священном короновании Их Императорских Величеств, вкралась одна чрезвычайно досадная опечатка. Напечатано: «Митрополит возложил на голову Его Императорского Величества ворону» – читай: «корову».
Commutative
Replicated
Data
Types
(CmRDT, op-based)
Op-based G-set⟨A⟩
Op-based LWW
G-counter
PN-counter
Op-based OR-Set
// Rust
type Tag = Timestamp;
type State<T> = Map<Tag, Option<T>>;
enum Op<T> {
Add(Tag, T),
Remove(Tag),
}
Op-based RGA
// Rust
type State<T> = Vec<(Tag, Option<T>)>;
enum Op<T> {
InsertBegin(Tag, T),
Insert(Tag, Tag, T),
Remove(Tag),
}
Replicated
Object
Notation
- Обучу CRDT
- Помогу спроектировать распределённое приложение
- Реализую фичи в RON для вас
-
Twitter: @cblp_su
-
Telegram: @cblp
-
E-mail: crdt@cblp.su
CRDT
By cblpsu
CRDT
- 1,248