Синхронизация изнутри

Статья «Как работает синхронизация» описывает то, что вы видите. Эта спускается на уровень глубже, к тому, что каждое устройство и сервер на самом деле делают с вашими изменениями.

Каждое изменение становится операцией

Когда вы редактируете заметку, устройство за один шаг делает две вещи: сохраняет новый текст в локальной базе данных и добавляет в очередь операцию, небольшую запись, которая говорит: «эта заметка изменилась, вот новая версия». Создание, редактирование, закрепление, добавление тегов, архивирование и удаление заметки, всё это операции.

Перед отправкой очереди устройство наводит в ней порядок. Десять быстрых правок одной заметки превращаются в одну. Если вы закрепили заметку, пока ещё печатаете в ней, закрепление и новый текст сливаются в одну операцию, так что ни одно изменение не теряется. Значение имеет только порядок в очереди: более позднее изменение всегда побеждает более раннее, что бы ни показывали часы на устройстве.

Операция покидает очередь только после того, как сервер её подтвердит. Если связь оборвётся на полпути или вы закроете приложение посреди синхронизации, в следующий раз очередь будет на месте, и ничего не потеряется.

Сначала отправка, потом получение

Синхронизация состоит из двух простых разговоров с сервером:

  • Отправка. Устройство отправляет операции из очереди пакетами. Сервер применяет каждую и записывает её в журнал изменений вашего аккаунта, присваивая каждой записи следующий порядковый номер.
  • Получение. Устройство спрашивает: «что изменилось после номера 1 234?» Сервер отвечает всеми записями журнала после этого номера, и устройство применяет их к своей локальной базе данных.

Поскольку каждое устройство помнит последний увиденный номер, оно скачивает только новое. Неважно, сколько времени устройство было офлайн: оно догоняет ровно с того места, где остановилось.

Всё, что меняет ваши заметки, проходит через этот журнал, включая изменения, сделанные через API или через инструмент ИИ, подключённый по MCP. Поэтому заметка, которую для вас написал ИИ-ассистент, появляется на всех ваших устройствах, как и любая другая.

Как обнаруживаются конфликты

Каждая правка, которую отправляет устройство, несёт отметку о последней версии этой заметки, которую оно видело. Если копия на сервере с тех пор изменилась, потому что её тем временем отредактировало другое устройство, сервер ничего не перезаписывает. Вместо этого он отвечает своей копией.

Тогда устройство пробует трёхстороннее слияние, тот же приём, которым пользуются системы контроля версий. Оно сравнивает три текста: версию, с которой начинали оба устройства, вашу и серверную. Если правки затрагивают разные части заметки, устройство объединяет их и отправляет результат, а вы ничего не замечаете. Только когда оба устройства изменили одни и те же строки, Caliu спрашивает, какую версию оставить. Смотрите статью «Разрешение конфликтов синхронизации».

Некоторые изменения не могут конфликтовать в принципе. Закрепление, архивирование и перевод заметки в режим только для чтения не считаются правками её текста, поэтому чисто сливаются с чем угодно.

Одни и те же правила на каждом устройстве

Веб-приложение, приложения для Apple и для Android написаны на трёх разных языках, но следуют одним и тем же правилам синхронизации. Правила наведения порядка в очереди проверяются на всех трёх по одному общему набору тестовых случаев, поэтому изменение, сделанное на одном устройстве, любое другое обрабатывает точно так же.

Без аккаунта

Без аккаунта ничего и никогда не покидает ваше устройство. Когда вы входите в аккаунт, заметки, которые уже есть на устройстве, присоединяются к нему и отправляются на сервер, как любое другое изменение.