Мобильный system design: заметки с синхронизацией между устройствами
Вопрос
Спроектируйте приложение заметок, которое работает полностью офлайн и синхронизирует заметки между телефоном, планшетом и вебом. Одну заметку могут менять на двух устройствах офлайн.
Коротко
Что должно быть в решении
- 1Требования: полный офлайн, несколько устройств, вложения, поиск, конфликты
- 2Данные: локальная база с версиями записей, outbox операций, вложения отдельно
- 3Синхронизация: push изменений и pull по курсору, удаления через надгробия
- 4Конфликты: версии и слияние по полям, CRDT для текста при совместном редактировании
- 5Поиск: локальный полнотекстовый индекс
- 6Узкие места: большой первый синк, миграции схемы, размер истории изменений
Что спросит интервьюер
- Как будет выглядеть синхронизация после месяца офлайна?
- Почему не подходит last write wins для текста заметки?
Разбор
Источник правды на устройстве локальная база (SQLite через Room, GRDB, Drift), с полнотекстовым индексом для поиска. Каждая заметка имеет id, версию и метку изменённых полей. Любое изменение пишется локально и в outbox.
Синхронизация в две стороны: клиент отправляет операции из outbox (идемпотентно по id операции), затем запрашивает изменения после своего курсора, включая надгробия удалённых. Запускается при старте, появлении сети, по системному планировщику и по тихому push.
Конфликты: заголовок, папка и флаги сливаются по полям с серверной версией. Текст заметки, который правили на двух устройствах офлайн, перезапись потеряет, поэтому текст хранится как CRDT-документ (например, Automerge или Yjs), и изменения сходятся автоматически. Если CRDT избыточен, сохраняем обе версии и показываем пользователю «конфликтующая копия».
Вложения синхронизируются отдельно, лениво, с дедупликацией по хешу. Первый синк большого аккаунта постраничный, сначала свежие заметки. Отставшим больше срока хранения надгробий клиентам сервер предлагает полную пересинхронизацию.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Мобильный system design: мессенджер
Следующий вопрос
Мобильный system design: истории (stories)
Ещё по теме «Мобильный system design»
- Мобильный system design: SDK аналитики событий
- Мобильный system design: перевод денег в банковском приложении
- Мобильный system design: каталог и корзина маркетплейса
- Мобильный system design: лента новостей с картинками и видео
- Мобильный system design: загрузка фото и видео
- Мобильный system design: такси с отслеживанием машины на карте
- Оценка объёмов в мобильном system design
- Пагинация ленты на мобильном