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

Раздел 9. Медиа и CDN

Чем загрузка фото/видео отличается от текста; объектное хранилище; CDN, превью и транскодинг; почему в сообщении лежит ссылка, а не само «тело».

До сих пор мы возили по системе крошечный текст — сотни байт. Но в мессенджере летают фото, видео, голосовые, документы — это уже мегабайты и гигабайты. И ведут они себя совсем иначе. Главная мысль раздела: у медиа отдельный путь, не такой, как у текста.

Почему медиа — это не текст

Сравним размеры: текстовое сообщение — около трёхсот байт, а видео — десятки и сотни мегабайт. Разница в миллионы раз. Гнать такой файл через канал сообщений и складывать в базу сообщений нельзя:

  • он забьёт канал доставки, по которому должны быстро бегать лёгкие сообщения;
  • база сообщений заточена под маленькие записи, а большие файлы хранить в ней дорого и неудобно.

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

Как на самом деле отправляется большой файл

Файл идёт в обход канала сообщений. Схема такая:

  1. Устройство загружает файл отдельно — прямо в специальное хранилище для файлов, не через Message-сервис.
  2. В ответ оно получает ссылку (адрес файла) и кое-какие данные о нём.
  3. И только теперь отправитель шлёт обычное маленькое сообщение, внутри которого — не сам файл, а ссылка на него плюс описание: тип, размер и маленькое превью.

То есть «тело» (большой файл) и «сообщение со ссылкой» едут разными дорогами и хранятся в разных местах.

Объектное хранилище

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

Почему в сообщении лежит ссылка, а не файл

Это любимый вопрос на интервью, и причин несколько:

  • Сообщение остаётся крошечным. А значит — быстро доставляется, дёшево хранится, легко шардируется и реплицируется (всё из Раздела 8 продолжает работать).
  • Файл хранится один раз. В групповом чате ссылку получают все участники, но сам файл лежит в одном экземпляре — его не копируют на каждого получателя.
  • Каждому — своё хранилище. Маленькие сообщения в базе сообщений, большие файлы в объектном хранилище. Каждый инструмент под свою задачу.

CDN: чтобы качалось быстро

Когда файл загружен, его ещё надо отдавать — иногда миллионам людей (вирусное видео в большом канале). Если все будут качать из одного далёкого дата-центра, будет медленно, а хранилище захлебнётся. Поэтому используют CDN.

CDN — CDN (Content Delivery Network) — это географически распределённая сеть серверов, ускоряющая загрузку сайтов и приложений. это сеть серверов, раскиданных по всему миру, которые держат копии файлов поближе к пользователям. Когда Боб скачивает видео, оно берётся с ближайшего к нему сервера, а не из одного центрального. Что это даёт:

  • скорость — файл едет с близкого сервера, задержка меньше;
  • разгрузка — основное хранилище не задыхается под лавиной скачиваний, особенно для популярного контента.

Превью и транскодинг

Две вещи, которые делают при загрузке:

  • Превью (маленькая уменьшенная картинка) — чтобы в чате сразу что-то показать, пока полный файл ещё качается. Поэтому превью кладут прямо в сообщение рядом со ссылкой.
  • Транскодинг — это перекодирование медиа в разные форматы и качества (например, одно видео — в несколько разрешений), чтобы оно подходило под разные устройства и скорость сети. Работа тяжёлая, поэтому её делают в фоне уже после загрузки, не задерживая отправку.

Полезные тонкости

  • Загрузка кусками. Большой файл грузят частями: если связь оборвалась, можно докачать с места обрыва, а не начинать заново.
  • Один файл — одна копия. Одинаковые файлы (по «отпечатку» содержимого) хранят в единственном экземпляре, экономя место.
  • Приватность. Ссылки делают временными и подписанными, чтобы по чужой ссылке нельзя было ничего скачать. А при сквозном шифровании файл шифруется на устройстве до загрузки — хранилище видит лишь зашифрованные байты (подробнее — Часть 5).

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

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

«Как устроена отправка большого видео?» Образец: «Файл загружается отдельно, в обход канала сообщений, прямо в объектное хранилище — часто кусками, чтобы можно было докачать при обрыве. В ответ приходит ссылка. Затем отправляется обычное маленькое сообщение со ссылкой, типом, размером и превью. В фоне видео перекодируется в разные качества (транскодинг), а отдаётся пользователям через CDN.»

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


#мессенджер #медиа #объектное-хранилище #cdn #транскодинг #подготовка-к-интервью