We created a new video streaming app to help you learn about ScyllaDB. This blog covers its features, tech stack, and data modeling. Acabamos de publicar una nueva aplicación de muestra ScyllaDB, una aplicación de video streaming. Este blog cubre las características de la aplicación de video streaming, la pila de tecnología y rompe el proceso de modelado de datos. Disponible en GitHub Características de la aplicación de video streaming La aplicación tiene un diseño mínimo con las características más esenciales de la aplicación de video streaming: Listar todos los videos, ordenados por fecha de creación (página principal) Vídeos que has empezado a ver Ver vídeo Sigue viendo un video donde te has dejado Mostrar una barra de progreso bajo cada miniatura de vídeo Tecnología Stack Lenguaje de programación: TypeScript Base de datos: ScyllaDB Framework: NextJS (router de páginas) Librería de componentes: Material_UI Uso de ScyllaDB para aplicaciones de streaming de vídeo de baja latencia ScyllaDB es una base de datos NoSQL de baja latencia y de alto rendimiento compatible con Apache Cassandra y DynamoDB. Es adecuado para manejar los requisitos de almacenamiento y recuperación de datos a gran escala de las aplicaciones de streaming de vídeo. ScyllaDB tiene controladores en todos los lenguajes de programación populares y, como muestra esta aplicación de muestra, se integra bien con marcos de desarrollo web modernos como NextJS. La baja latencia en el contexto de los servicios de transmisión de vídeo es crucial para proporcionar una experiencia de usuario sin problemas. Para poner las bases para un alto rendimiento, necesita diseñar un modelo de datos que se adapte a sus necesidades. Video streaming de aplicaciones de modelado de datos En la , enseñamos que el modelado de datos NoSQL siempre debe comenzar con su aplicación y consultas primero.Después, trabaja hacia atrás y crea el esquema basado en las consultas que desea ejecutar en su aplicación.Este proceso asegura que crea un modelo de datos que se ajuste a sus consultas y cumpla con sus requisitos. Curso de Modelado de Datos de la Universidad ScyllaDB Con esto en mente, vamos a pasar por encima de las consultas que nuestra aplicación de video streaming necesita ejecutar en cada carga de página! Página principal: Sigue viendo En esta página, puede listar todos los vídeos que han comenzado a ver. Esta vista incluye las miniaturas de vídeo y la barra de progreso debajo de la miniatura. Query – get watch progress: SELECT video_id, progress FROM watch_history WHERE user_id = ? LIMIT 9; Schema – watch history table: CREATE TABLE watch_history ( user_id text, video_id text, progress int, watched_at timestamp, PRIMARY KEY (user_id) ); Para esta consulta, tiene sentido definir 'user_id' como la clave de partición porque es el filtro que usamos para consultar la tabla de historial del reloj. Tenga en cuenta que este esquema puede necesitar ser actualizado más adelante si hay una consulta que requiere filtrar en otras columnas más allá de 'user_id'. Además del valor de progreso, la aplicación también necesita obtener los metadatos reales de cada vídeo (por ejemplo, el título y la imagen de miniatura). Query – get video metadata: SELECT * FROM video WHERE id IN ?; Tenga en cuenta cómo utilizamos el operador “IN” y no “=” porque necesitamos recoger una lista de videos no sólo un solo vídeo. Schema – video table: CREATE TABLE video ( id text, content_type text, title text, url text, thumbnail text, created_at timestamp, duration int, PRIMARY KEY (id) ); Para la tabla de vídeo, definamos el 'id' como la clave de partición porque es el único filtro que usamos en la consulta. Página: Ver vídeo Si hace clic en cualquiera de los botones "Mira", serán redirigidos a una página con un reproductor de vídeo donde pueden iniciar y parar el vídeo. Query – get video content: SELECT * FROM video WHERE id = ?; Esta es una consulta muy similar a la que se ejecuta en la página Continuar viendo. Por lo tanto, el mismo esquema funcionará muy bien para esta consulta también. Schema – video table: CREATE TABLE video ( id text, content_type text, title text, url text, thumbnail text, created_at timestamp, duration int, PRIMARY KEY (id) ); Página: Videos más recientes Finalmente, vamos a descomponer la página de Videos más recientes, que es la página de inicio de la aplicación. Analizamos esta página por última vez porque es la más compleja desde una perspectiva de modelado de datos. Esta página lista diez de los vídeos más recientemente cargados que están disponibles en la base de datos ordenada por la fecha de creación del vídeo. Tendremos que recoger estos vídeos en dos pasos: primero obtendremos los timestamps, luego obtendremos el contenido real del vídeo. Query – get the most recent ten videos’ timestamp: SELECT id, top10(created_at) AS date FROM recent_videos; Puede notar que usamos una función personalizada llamada `top10()`. Esta no es una función estándar en ScyllaDB. Es un UDF ( ) que hemos creado para resolver este problema de modelado de datos. Esta función devuelve un conjunto de los timestamps 'created_at' más recientes en la tabla. puede ser una gran manera de resolver sus desafíos de modelado de datos únicos. Funciones definidas por el usuario Crear un nuevo UDF en ScyllaDB Estos valores de timestamp pueden entonces utilizarse para consultar el contenido de vídeo real que queremos mostrar en la página. Query – get metadata for those videos: SELECT * FROM recent_videos WHERE created_at IN ? LIMIT 10; Schema – recent videos: CREATE MATERIALIZED VIEW recent_videos_view AS SELECT * FROM streaming.video WHERE created_at IS NOT NULL PRIMARY KEY (created_at, id); En la vista materializada de los vídeos recientes, la columna 'created_at' es la clave primaria porque filtramos por esa columna en nuestra primera consulta para obtener los valores de timestamp más recientes. . Partición caliente Además, la interfaz de usuario también muestra una pequeña barra de progreso debajo de la miniatura de cada vídeo que indica el progreso que has hecho viendo ese vídeo. Query – get watch progress for each video: SELECT progress FROM watch_history WHERE user_id = ? AND video_id = ?; Schema – watch history: CREATE TABLE watch_history ( user_id text, video_id text, progress int, watched_at timestamp, PRIMARY KEY (user_id, video_id) ); Puede haber notado que la tabla de historial del reloj ya se usaba en una consulta anterior para recuperar datos. Ahora, esta vez, el esquema tiene que ser modificado ligeramente para adaptarse a esta consulta. Vamos a agregar 'video_id' como una clave de agrupamiento. De esta manera, la consulta para recuperar el progreso del reloj funcionará correctamente. ¡Ahora vamos a ver el esquema final de la base de datos! Esquema de bases de datos finales 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) ); Función definida por el usuario para la página de Vídeos más recientes -- 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; Este Pero también podrías Crear la función asegúrese de habilitar UDFs en el archivo de configuración scylla.yaml (ubicación: /etc/scylla/scylla.yaml): UDF utiliza Lua usar Wasm para crear UDFs en ScyllaDB Clona el repo y empieza! Para empezar... Clona el repositorio: git clone https://github.com/scylladb/video-streaming https://github.com/scylladb/video-streaming Instalar las dependencias: npm install Cambiar el archivo de configuración: APP_BASE_URL="http://localhost:8000" SCYLLA_HOSTS="172.17.0.2" SCYLLA_USER="scylla" SCYLLA_PASSWD="xxxxx" SCYLLA_KEYSPACE="streaming" SCYLLA_DATACENTER="datacenter1" Migración de la base de datos e inserción de datos de muestra: npm run migrate ejecutar el servidor: npm run dev Envuelve Esperamos que disfrutes de nuestra aplicación de video streaming y que te ayude a construir aplicaciones de baja latencia y de alto rendimiento con ScyllaDB. Donde hay cursos gratuitos , de , y mucho más! Si tiene preguntas sobre la aplicación de muestreo de vídeo o ScyllaDB, ¡Y vamos a discutir! Universidad ScyllaDB Modelado de datos Conductores ScyllaDB Vaya a nuestro foro Más aplicaciones de muestra de ScyllaDB: Cárdenas - IoT La nube se inicia guía Características de Store Recursos relevantes : Aplicación de streaming de video GitHub repository Soluciones en ScyllaDB Cómo los agregados distribuidos de ScyllaDB reducen el tiempo de ejecución de consultas hasta 20X Wasmtime: Soporte de UDFs en ScyllaDB con WebAssembly Documentación ScyllaDB ScyllaDB se inicia ScyllaDB se inicia Acerca de Atila Tóth Es un defensor de desarrolladores en ScyllaDB. Escribe tutoriales y publicaciones de blog, habla en eventos, crea demostraciones y muestras de aplicaciones para ayudar a los desarrolladores a construir aplicaciones de alto rendimiento. Atila Toca