
"Создайте высокопроизводительное приложение потокового видео с Scylladb и NextJs"
5 августа 2025 г.Мы создали новое приложение потоковой передачи видео, чтобы помочь вам узнать о Scylladb. Этот блог охватывает свои функции, технический стек и моделирование данных.
Мы только что опубликовали новое приложение Scylladb, приложение потоковой передачи видео. Проект естьДоступно на GitHubПолем Этот блог охватывает функции приложения потоковой передачи видео, технологический стек и разбивает процесс моделирования данных.
Функции приложения потоковой передачи видео
Приложение имеет минимальный дизайн с наиболее важными функциями приложения потоковой передачи видео:
- Перечислите все видео, отсортированные по дате создания (домашняя страница)
- Перечислите видео, которые вы начали смотреть
- Смотреть видео
- Продолжайте смотреть видео, где вы остановились
- Отобразить панель прогресса под каждым видео миниатюр
Технологический стек
- Язык программирования:Машинопись
- База данных:Scylladb
- Рамки:NextJs(страницы маршрутизатора)
- Библиотека компонентов:Material_ui
Использование SCYLLADB для потоковой передачи видео с низкой задержкой
SCYLLADB-это база данных NOSQL с низкой задержкой и высокоэффективной базой данных NOSQL с Apache Cassandra и DynamoDB. Он хорошо подходит для выполнения крупномасштабных требований хранения данных и поиска приложений потоковой передачи видео. Scylladb имеет драйверы во всех популярных языках программирования, и, как демонстрирует это применение, он хорошо интегрируется с современными структурами веб -разработки, такими как NextJS.
Низкая задержка в контексте сервисов потоковой передачи видео имеет решающее значение для предоставления бесшовного пользовательского опыта. Чтобы заложить основу для высокой производительности, вам необходимо разработать модель данных, которая соответствует вашим потребностям. Давайте продолжим с примером процесса моделирования данных, чтобы увидеть, как это выглядит.
Моделирование данных приложения для потокового видео
ВКурс моделирования данных Университета SCYLLADBМы учим, что моделирование данных NOSQL всегда должно начинать с вашего приложения и запросов в первую очередь. Затем вы работаете задом наперед и создаете схему на основе запросов, которые вы хотите запустить в своем приложении. Этот процесс гарантирует, что вы создаете модель данных, которая соответствует вашим запросам и соответствует вашим требованиям.
Имея это в виду, давайте рассмотрим запросы, которые наше приложение потоковой передачи видео должно работать на каждой загрузке страницы!
Страница: продолжить смотреть
На этой странице вы можете перечислить все видео, которые они начали смотреть. Эта точка зрения включает в себя видео миниатюры и планшету прогресса под миниатюрой.
Запрос - Получите прогресс на наблюдение:
SELECT video_id, progress FROM watch_history WHERE user_id = ? LIMIT 9;
Схема - Стол Watch History Table:
CREATE TABLE watch_history (
user_id text,
video_id text,
progress int,
watched_at timestamp,
PRIMARY KEY (user_id)
);
Для этого запроса имеет смысл определить `user_id` как ключ раздела, потому что это фильтр, который мы используем для запроса таблицы истории часов. Имейте в виду, что эта схема может быть обновлена позже, если есть запрос, который требует фильтрации на других столбцах за пределами `user_id`. На данный момент, однако, эта схема верна для определенного запроса.
Помимо значения прогресса, приложение также необходимо получить фактические метаданные каждого видео (например, заголовок и изображение миниатюры). Для этого таблица «видео» должна быть запрошена.
Запрос - Получить видео метаданные:
SELECT * FROM video WHERE id IN ?;
Обратите внимание, как мы используем оператор «In», а не «=», потому что нам нужно извлечь список видео, а не только одно видео.
Схема - видео таблица:
CREATE TABLE video (
id text,
content_type text,
title text,
url text,
thumbnail text,
created_at timestamp,
duration int,
PRIMARY KEY (id)
);
Для видео таблицы давайте определим `id` как ключ раздела, потому что это единственный фильтр, который мы используем в запросе.
Page: Watch Video
Если вы нажмете на любую из кнопок «Смотреть», они будут перенаправлены на страницу с помощью видеоплеера, где они могут запустить и приостановить видео.
Запрос - Получите видеоконтент:
SELECT * FROM video WHERE id = ?;
Это очень похожий запрос на тот, который работает на странице продолжения просмотра. Таким образом, та же схема будет отлично подойдет и для этого запроса.
Схема - видео таблица:
CREATE TABLE video (
id text,
content_type text,
title text,
url text,
thumbnail text,
created_at timestamp,
duration int,
PRIMARY KEY (id)
);
Страница: самые последние видео
Наконец, давайте разберем самую последнюю страницу видео, которая является домашней страницей приложения. Мы анализируем эту страницу в последний раз, потому что она является наиболее сложной с точки зрения моделирования данных. На этой странице перечислены десять из последних загруженных видео, которые доступны в базе данных, заказанной датой создания видео.
Нам придется получить эти видео в двух шагах: сначала получите временные метки, а затем получить фактический видеоконтент.
Запрос - Получите самую последнюю TimeStamp: Deven Video:
SELECT id, top10(created_at) AS date FROM recent_videos;
Вы можете заметить, что мы используем пользовательскую функцию под названием `top10 ()`. Это не стандартная функция в Scylladb. Это UDF (Пользовательская функция), что мы создали для решения этой проблемы моделирования данных. Эта функция возвращает массив самых последних метков времени `create_at` в таблице.Создание нового UDF в ScylladbМожет быть отличным способом решить ваши уникальные проблемы моделирования данных.
Эти значения временной метки могут затем использоваться для запроса фактического видеоконтента, который мы хотим показать на странице.
Запрос - Получите метаданные для этих видео:
SELECT * FROM recent_videos WHERE created_at IN ? LIMIT 10;
Схема - недавние видео:
CREATE MATERIALIZED VIEW recent_videos_view AS
SELECT * FROM streaming.video
WHERE created_at IS NOT NULL
PRIMARY KEY (created_at, id);
В недавнем материализованном представлении видео столбец `create_at` является первичным ключом, потому что мы фильтруют по этому столбцу в нашем первом запросе, чтобы получить самые последние значения временной метки. Имейте в виду, что в некоторых случаях это может вызватьГорячий разделПолем
Кроме того, пользовательский интерфейс также показывает небольшую панель прогресса под миниатюрой каждого видео, которая указывает на прогресс, который вы добились, смотрели это видео. Чтобы получить это значение для каждого видео, приложение должно запросить таблицу «Смотреть историю».
Запрос - Получите прогресс на просмотр каждого видео:
SELECT progress FROM watch_history WHERE user_id = ? AND video_id = ?;
Схема - смотреть историю:
CREATE TABLE watch_history (
user_id text,
video_id text,
progress int,
watched_at timestamp,
PRIMARY KEY (user_id, video_id)
);
Возможно, вы заметили, что таблица истории часов уже использовалась в предыдущем запросе для получения данных. Теперь на этот раз схема должна быть слегка изменена, чтобы соответствовать этому запросу. Давайте добавим `video_id` как кластеризационный ключ. Таким образом, запрос на то, чтобы получить прогресс часов, будет работать правильно.
Вот и все. Теперь давайте посмотрим на окончательную схему базы данных!
Окончательная схема базы данных
CREATE KEYSPACE IF NOT EXISTS streaming WITH replication = { 'class': 'NetworkTopologyStrategy', 'replication_factor': '3' };
CREATE TABLE streaming.video (
id text,
content_type text,
title text,
url text,
thumbnail text,
created_at timestamp,
duration int,
PRIMARY KEY (id)
);
CREATE TABLE streaming.watch_history (
user_id text,
video_id text,
progress int,
watched_at timestamp,
PRIMARY KEY (user_id, video_id)
);
CREATE TABLE streaming.recent_videos (
id text,
content_type text,
title text,
url text,
thumbnail text,
created_at timestamp,
duration int,
PRIMARY KEY (created_at)
);
Пользовательская функция для самой последней страницы видео
-- Create a UDF for recent videos
CREATE OR REPLACE FUNCTION state_f(acc list<timestamp>, val timestamp)
CALLED ON NULL INPUT
RETURNS list<timestamp>
LANGUAGE lua
AS $$
if val == nil then
return acc
end
if acc == nil then
acc = {}
end
table.insert(acc, val)
table.sort(acc, function(a, b) return a > b end)
if #acc > 10 then
table.remove(acc, 11)
end
return acc
$$;
CREATE OR REPLACE FUNCTION reduce_f(acc1 list<timestamp>, acc2 list<timestamp>)
CALLED ON NULL INPUT
RETURNS list<timestamp>
LANGUAGE lua
AS $$
result = {}
i = 1
j = 1
while #result < 10 do
if acc1[i] > acc2[j] then
table.insert(result, acc1[i])
i = i + 1
else
table.insert(result, acc2[j])
j = j + 1
end
end
return result
$$;
CREATE OR REPLACE AGGREGATE top10(timestamp)
SFUNC state_f
STYPE list<timestamp>
REDUCEFUNC reduce_f;
ЭтотUDF использует LUA, но вы также могли быИспользуйте WASM для создания UDF в SCYLLADBПолем Создание функции обязательно включите UDFS в файле конфигурации scylla.yaml (местоположение: /etc/scylla/scylla.yaml):
Клонировать репо и начните!
Чтобы начать ...
Клонировать репозиторий:
git clone
https://github.com/scylladb/video-streaming
Установите зависимости:
npm install
Измените файл конфигурации:
APP_BASE_URL="http://localhost:8000"
SCYLLA_HOSTS="172.17.0.2"
SCYLLA_USER="scylla"
SCYLLA_PASSWD="xxxxx"
SCYLLA_KEYSPACE="streaming"
SCYLLA_DATACENTER="datacenter1"
Мигрируйте базу данных и вставьте данные образца:
npm run migrate
Запустите сервер:
npm run dev
Завершая
Мы надеемся, что вам понравится наше приложение для потоковой передачи видео, и оно поможет вам создать приложения с низкой задержкой и высокоэффективными приложениями Scylladb. Если вы хотите продолжать учиться, проверьтеУниверситет SCYLLADBгде у нас есть бесплатные курсы наМоделирование данныхВДрайверы Scylladbи многое другое! Если у вас есть вопросы о примере приложения потоковой передачи видео или Scylladb,Зайдите на наш форумИ давайте обсудим!
Больше приложений Scylladb:
- Carepet - IoT
- Руководство по началу работы облака
- Функциональный магазин
Соответствующие ресурсы:
- Приложение для потокового видео
- UDFS в Scylladb
- Как распределенные агрегаты scylladb сокращают время выполнения запросов до 20 раз
- Wasmtime: поддержка UDFS в Scylladb с Webassembly
- Документация SCYLLADB
Scylladb начинается
Об Аттиле Тот
Аттила Тотявляется адвокатом разработчика в Scylladb. Он пишет учебные пособия и посты в блоге, выступает на мероприятиях, создает демонстрации и примеры приложений, чтобы помочь разработчикам создавать высокопроизводительные приложения.
Оригинал