Курс «Архитектура мессенджера» · Часть 3 · Хранение и данные

Раздел 10. Несколько устройств и синхронизация истории

Один аккаунт — много устройств; синхронизация истории; новое устройство и догрузка чатов; конфликты и «источник правды».

До сих пор мы говорили «Боб», подразумевая одно устройство. В жизни всё хитрее: у одного человека телефон, ноутбук, планшет, веб-версия — и переписка должна быть одинаковой везде. Сообщение обязано прийти на все устройства, а прочитанное на телефоне — отметиться и на ноутбуке. Этот раздел про то, как это держат в согласии.

Один аккаунт — много устройств

Главное различение: аккаунт — это не устройство. У аккаунта есть несколько зарегистрированных устройств, и каждое из них держит свою живую связь с сервером (как в Разделе 3).

Поэтому Реестр сессий хранит не «пользователь → один сервер», а «пользователь → все его подключённые устройства». Когда сообщение адресовано Бобу, его надо доставить на каждое устройство Боба:

  • те устройства, что сейчас в сети, получают сообщение сразу;
  • те, что офлайн, заберут его при следующем входе — из очереди (Раздел 5). По сути, у каждого устройства своя позиция «докуда я всё получил».

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

Источник правды — это сервер

Ключевое понятие раздела — источник правды (по-английски source of truth). Это единственное место, которому верят все устройства; остальные просто подтягивают данные оттуда.

В мессенджере источник правды — сервер (база сообщений). Устройства — это лишь копии для удобства и скорости, локальные кэши истории. Аналогия: облачный документ — главный, а копии на твоих устройствах синхронизируются с ним.

Почему правда живёт на сервере, а не на устройстве? Потому что устройства ненадёжны как хранилище общей истории: их теряют, разбивают, переустанавливают, они подолгу бывают офлайн. А история должна быть там, где надёжно и доступно для всех устройств сразу. Каждое устройство просто синхронизируется с сервером по принципу «у меня всё вот до этого номера — дай новее» (опираясь на порядковые номера из Раздела 6).

Новое устройство: догрузка истории

Раз источник правды — сервер, новое устройство получает прошлое легко:

  1. Установил приложение на новом телефоне → устройство регистрируется в аккаунте.
  2. Оно подтягивает с сервера список чатов и историю.
  3. Обычно сначала качают свежее (последние сообщения каждого чата), а старое — по мере прокрутки вверх, чтобы не тянуть сразу годы переписки.

Именно потому, что правда на сервере, новое устройство видит всю историю, хотя его раньше не существовало.

Конфликты и согласование

Синхронизировать нужно не только сами сообщения, но и состояние вокруг них: что прочитано, что удалено, реакции, название чата. И тут возможны рассинхроны.

Пример: Алиса отметила чат прочитанным на телефоне, а ноутбук в этот момент офлайн. Решение — то же: «прочитано» — это тоже событие, оно сохраняется на сервере и при подключении ноутбука синхронизируется на него. Удаление, реакции — аналогично: маленькие события, которые расходятся на все устройства.

Если два устройства независимо что-то поменяли — это конфликт. Его разрешают через источник правды и порядковые номера/время, а состояние обычно сходится чуть позже (это та самая «допустимая неточность» из Раздела 2: не обязательно идеально в ту же миллисекунду, главное — сойтись).

Мостик к безопасности

Запомни на будущее: мультидевайс сильно усложняет сквозное шифрование. Если сообщение шифруется лично для получателя, то у каждого устройства — свои ключи, и сообщение приходится шифровать отдельно для каждого устройства. Поэтому в сквозном шифровании единица — не «пользователь», а «устройство». Подробно разберём в Разделах 15–16, но корни проблемы — здесь.

Вопросы интервьюера (с разбором)

«Как одно сообщение доходит до всех устройств пользователя?» Образец: «Аккаунт — это набор устройств, каждое со своей живой связью, и Реестр сессий знает их все. Сообщение, адресованное пользователю, доставляется на каждое подключённое устройство; офлайн-устройства забирают его из очереди при следующем входе, у каждого своя позиция "докуда получено". И своё сообщение отправитель тоже отражает на остальные свои устройства, чтобы переписка везде совпадала.»

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

«Где источник правды по прочитанности?» Образец: «На сервере. Прочитанность — это событие, которое сохраняется на сервере и синхронизируется на все устройства, в том числе на те, что были офлайн. Устройства — лишь копии; при расхождении состояние сходится по данным сервера. Идеальной мгновенной согласованности тут не требуется, достаточно, чтобы устройства сошлись чуть позже.»


#мессенджер #мультидевайс #синхронизация #источник-правды #прочитанность #подготовка-к-интервью