Согласно этой статье решения для сохранения сортировки позиции в списке символов идентификатор позиции должен содержать идентификатор сайта для каждого ди git, чтобы вставка выполнялась в соответствии с размером сайта. Я бы. Синхронизация достигается потому, что каждая операция коммутативна и идемпотентна. Ниже показан пример и некоторые фрагменты кода.
[(1, 0)] 0.1
[(1, 0), (4, 0)] 0.14
[(1, 0), (6, 0), (3, 1)] 0.163
[(1, 0), (7, 0)] 0.17
[(1, 1)] 0.1
[(1, 1), (1, 1)] 0.11
Хорошо, теперь, начиная с этого примера, возможна следующая ситуация.
[(1, 0)]
[(1, 0), (4, 0)]
[(1, 0), (5, 0)]
[(1, 0), (5, 0), (2, 0)]
[(1, 0), (6, 0), (3, 1)]
[(1, 0), (7, 0)]
[(1, 1)]
[(1, 1), (1, 1)]
Допустим, два пира хотят написать символ между [(1, 0), (5, 0), (2, 0)]
и [(1, 0), (6, 0), (3, 1)]
, тогда каждый из них генерирует один и тот же идентификатор позиции, имеющий последний идентификатор, отличный от идентификатора сайта
peer 0 -> [(1, 0), (5, 0), (2, 0), (6, 0)]
peer 1 -> [(1, 0), (5, 0), (2, 0), (6, 1)]
Включение их в список символов не нарушит позицию сортировка
[(1, 0)]
[(1, 0), (4, 0)]
[(1, 0), (5, 0)]
[(1, 0), (5, 0), (2, 0)]
[(1, 0), (5, 0), (2, 0), (6, 0)]
[(1, 0), (5, 0), (2, 0), (6, 1)]
[(1, 0), (6, 0), (3, 1)]
[(1, 0), (7, 0)]
[(1, 1)]
[(1, 1), (1, 1)]
Но что произойдет, если peer 0
захочет вставить новый символ между ними? Разве сортировка позиций не нарушена?
[(1, 0)]
[(1, 0), (4, 0)]
[(1, 0), (5, 0)]
[(1, 0), (5, 0), (2, 0)]
[(1, 0), (5, 0), (2, 0), (6, 0)]
?
[(1, 0), (5, 0), (2, 0), (6, 1)]
[(1, 0), (6, 0), (3, 1)]
[(1, 0), (7, 0)]
[(1, 1)]
[(1, 1), (1, 1)]