Проектирование Senior Мобильный system design обновлено

Мобильный system design: заметки с синхронизацией между устройствами

Вопрос

Спроектируйте приложение заметок, которое работает полностью офлайн и синхронизирует заметки между телефоном, планшетом и вебом. Одну заметку могут менять на двух устройствах офлайн.

Коротко

Источник правды на устройстве локальная база (SQLite через Room, GRDB, Drift), с полнотекстовым индексом для поиска. Каждая заметка имеет id, версию и метку изменённых полей.

Что должно быть в решении

  1. 1
    Требования: полный офлайн, несколько устройств, вложения, поиск, конфликты
  2. 2
    Данные: локальная база с версиями записей, outbox операций, вложения отдельно
  3. 3
    Синхронизация: push изменений и pull по курсору, удаления через надгробия
  4. 4
    Конфликты: версии и слияние по полям, CRDT для текста при совместном редактировании
  5. 5
    Поиск: локальный полнотекстовый индекс
  6. 6
    Узкие места: большой первый синк, миграции схемы, размер истории изменений

Что спросит интервьюер

  • Как будет выглядеть синхронизация после месяца офлайна?
  • Почему не подходит last write wins для текста заметки?

Разбор

Источник правды на устройстве локальная база (SQLite через Room, GRDB, Drift), с полнотекстовым индексом для поиска. Каждая заметка имеет id, версию и метку изменённых полей. Любое изменение пишется локально и в outbox.

Синхронизация в две стороны: клиент отправляет операции из outbox (идемпотентно по id операции), затем запрашивает изменения после своего курсора, включая надгробия удалённых. Запускается при старте, появлении сети, по системному планировщику и по тихому push.

Конфликты: заголовок, папка и флаги сливаются по полям с серверной версией. Текст заметки, который правили на двух устройствах офлайн, перезапись потеряет, поэтому текст хранится как CRDT-документ (например, Automerge или Yjs), и изменения сходятся автоматически. Если CRDT избыточен, сохраняем обе версии и показываем пользователю «конфликтующая копия».

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

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.