Раздел 10. Несколько устройств и синхронизация истории
Один аккаунт — много устройств; синхронизация истории; новое устройство и догрузка чатов; конфликты и «источник правды».
До сих пор мы говорили «Боб», подразумевая одно устройство. В жизни всё хитрее: у одного человека телефон, ноутбук, планшет, веб-версия — и переписка должна быть одинаковой везде. Сообщение обязано прийти на все устройства, а прочитанное на телефоне — отметиться и на ноутбуке. Этот раздел про то, как это держат в согласии.
Один аккаунт — много устройств
Главное различение: аккаунт — это не устройство. У аккаунта есть несколько зарегистрированных устройств, и каждое из них держит свою живую связь с сервером (как в Разделе 3).
Поэтому Реестр сессий хранит не «пользователь → один сервер», а «пользователь → все его подключённые устройства». Когда сообщение адресовано Бобу, его надо доставить на каждое устройство Боба:
- те устройства, что сейчас в сети, получают сообщение сразу;
- те, что офлайн, заберут его при следующем входе — из очереди (Раздел 5). По сути, у каждого устройства своя позиция «докуда я всё получил».
Тонкость, о которой часто забывают: отправитель тоже многоустройственный. Когда Алиса пишет с телефона, это сообщение нужно показать и на её ноутбуке — иначе на разных устройствах будет разная переписка. То есть своё же сообщение «отражается» на остальные устройства отправителя.
Источник правды — это сервер
Ключевое понятие раздела — источник правды (по-английски source of truth). Это единственное место, которому верят все устройства; остальные просто подтягивают данные оттуда.
В мессенджере источник правды — сервер (база сообщений). Устройства — это лишь копии для удобства и скорости, локальные кэши истории. Аналогия: облачный документ — главный, а копии на твоих устройствах синхронизируются с ним.
Почему правда живёт на сервере, а не на устройстве? Потому что устройства ненадёжны как хранилище общей истории: их теряют, разбивают, переустанавливают, они подолгу бывают офлайн. А история должна быть там, где надёжно и доступно для всех устройств сразу. Каждое устройство просто синхронизируется с сервером по принципу «у меня всё вот до этого номера — дай новее» (опираясь на порядковые номера из Раздела 6).
Новое устройство: догрузка истории
Раз источник правды — сервер, новое устройство получает прошлое легко:
- Установил приложение на новом телефоне → устройство регистрируется в аккаунте.
- Оно подтягивает с сервера список чатов и историю.
- Обычно сначала качают свежее (последние сообщения каждого чата), а старое — по мере прокрутки вверх, чтобы не тянуть сразу годы переписки.
Именно потому, что правда на сервере, новое устройство видит всю историю, хотя его раньше не существовало.
Конфликты и согласование
Синхронизировать нужно не только сами сообщения, но и состояние вокруг них: что прочитано, что удалено, реакции, название чата. И тут возможны рассинхроны.
Пример: Алиса отметила чат прочитанным на телефоне, а ноутбук в этот момент офлайн. Решение — то же: «прочитано» — это тоже событие, оно сохраняется на сервере и при подключении ноутбука синхронизируется на него. Удаление, реакции — аналогично: маленькие события, которые расходятся на все устройства.
Если два устройства независимо что-то поменяли — это конфликт. Его разрешают через источник правды и порядковые номера/время, а состояние обычно сходится чуть позже (это та самая «допустимая неточность» из Раздела 2: не обязательно идеально в ту же миллисекунду, главное — сойтись).
Мостик к безопасности
Запомни на будущее: мультидевайс сильно усложняет сквозное шифрование. Если сообщение шифруется лично для получателя, то у каждого устройства — свои ключи, и сообщение приходится шифровать отдельно для каждого устройства. Поэтому в сквозном шифровании единица — не «пользователь», а «устройство». Подробно разберём в Разделах 15–16, но корни проблемы — здесь.
Вопросы интервьюера (с разбором)
«Как одно сообщение доходит до всех устройств пользователя?» Образец: «Аккаунт — это набор устройств, каждое со своей живой связью, и Реестр сессий знает их все. Сообщение, адресованное пользователю, доставляется на каждое подключённое устройство; офлайн-устройства забирают его из очереди при следующем входе, у каждого своя позиция "докуда получено". И своё сообщение отправитель тоже отражает на остальные свои устройства, чтобы переписка везде совпадала.»
«Как новое устройство получает историю?» Образец: «Источник правды — сервер, поэтому новое устройство просто регистрируется в аккаунте и подтягивает с сервера список чатов и историю. Обычно сначала свежие сообщения, а старое догружается по мере прокрутки вверх, чтобы не качать всё сразу.»
«Где источник правды по прочитанности?» Образец: «На сервере. Прочитанность — это событие, которое сохраняется на сервере и синхронизируется на все устройства, в том числе на те, что были офлайн. Устройства — лишь копии; при расхождении состояние сходится по данным сервера. Идеальной мгновенной согласованности тут не требуется, достаточно, чтобы устройства сошлись чуть позже.»
#мессенджер #мультидевайс #синхронизация #источник-правды #прочитанность #подготовка-к-интервью