We created a new video streaming app to help you learn about ScyllaDB. This blog covers its features, tech stack, and data modeling. Nous venons de publier une nouvelle application d'échantillon ScyllaDB, une application de streaming vidéo. Ce blog couvre les fonctionnalités de l'application de streaming vidéo, la pile de technologie et décompose le processus de modélisation des données. Disponible sur GitHub Caractéristiques de l'app de streaming vidéo L'application a un design minimal avec les fonctionnalités d'application de streaming vidéo les plus essentielles: Liste de toutes les vidéos, triées par date de création (page d'accueil) Liste des vidéos que vous avez commencé à regarder Voir la vidéo Continuer à regarder une vidéo où vous avez abandonné Afficher une barre de progrès sous chaque miniature vidéo Technologie Stack Langage de programmation : TypeScript Base de données : ScyllaDB Framework : NextJS (routeur de pages) Bibliothèque de composants : Material_UI Utilisation de ScyllaDB pour les applications de streaming vidéo à faible latence ScyllaDB est une base de données NoSQL à faible latence et haute performance compatible avec Apache Cassandra et DynamoDB. Il est bien adapté pour gérer les exigences de stockage et de récupération de données à grande échelle des applications de streaming vidéo. ScyllaDB dispose de pilotes dans tous les langages de programmation populaires et, comme le démontre cette application d'échantillon, il s'intègre bien avec les cadres de développement Web modernes tels que NextJS. La faible latence dans le contexte des services de streaming vidéo est cruciale pour fournir une expérience utilisateur sans fil. Pour poser les bases d'une performance élevée, vous devez concevoir un modèle de données qui correspond à vos besoins. Modélisation de données de l'application de streaming vidéo Dans le , nous enseignons que la modélisation de données NoSQL devrait toujours commencer par votre application et vos requêtes en premier.Ensuite, vous travaillez en arrière et créez le schéma en fonction des requêtes que vous souhaitez exécuter dans votre application.Ce processus garantit que vous créez un modèle de données qui correspond à vos requêtes et répond à vos exigences. Cours de modélisation de données de l'université ScyllaDB Avec cela à l'esprit, passons aux requêtes que notre application de streaming vidéo doit exécuter à chaque chargement de page! Étiquette : continuer à regarder Sur cette page, vous pouvez énumérer toutes les vidéos qu'ils ont commencé à regarder. Cette vue comprend les miniatures de la vidéo et la barre de progression sous la miniature. 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) ); Pour cette requête, il est logique de définir 'user_id' comme la clé de partition car c'est le filtre que nous utilisons pour la requête de la table de l'historique de l'horloge. Gardez à l'esprit que ce schéma peut avoir besoin d'être mis à jour plus tard s'il existe une requête qui nécessite le filtrage sur d'autres colonnes au-delà de la 'user_id'. En plus de la valeur de progrès, l'application doit également obtenir les métadonnées réelles de chaque vidéo (par exemple, le titre et l'image de miniature). Query – get video metadata: SELECT * FROM video WHERE id IN ?; Notez comment nous utilisons l'opérateur "IN" et non "=" car nous devons récupérer une liste de vidéos, pas seulement une seule vidéo. 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) ); Pour la table vidéo, définissons l'id comme la clé de partition car c'est le seul filtre que nous utilisons dans la requête. Page : Voir la vidéo Si vous cliquez sur l’un des boutons « Regarder », ils seront redirigés vers une page avec un lecteur vidéo où ils peuvent démarrer et arrêter la vidéo. Query – get video content: SELECT * FROM video WHERE id = ?; C'est une requête très similaire à celle qui s'exécute sur la page Continuer de regarder. Ainsi, le même schéma fonctionnera très bien pour cette requête aussi. 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) ); Page : Les vidéos les plus récentes Nous analysons cette page dernière parce que c'est la plus complexe d'un point de vue de modélisation de données. Cette page liste dix des vidéos les plus récemment téléchargées qui sont disponibles dans la base de données ordonnée par la date de création de la vidéo. Nous allons devoir collecter ces vidéos en deux étapes: d'abord obtenir les timestamps, puis obtenir le contenu vidéo réel. Query – get the most recent ten videos’ timestamp: SELECT id, top10(created_at) AS date FROM recent_videos; Vous remarquerez peut-être que nous utilisons une fonction personnalisée appelée `top10()`. Ce n'est pas une fonction standard dans ScyllaDB. ) que nous avons créé pour résoudre ce problème de modélisation de données. Cette fonction renvoie une série des timestamps les plus récents `created_at` dans le tableau. peut être un excellent moyen de résoudre vos défis de modélisation de données uniques. Fonction utilisateur définie Créer une nouvelle UDF dans ScyllaDB Ces valeurs de timestamp peuvent ensuite être utilisées pour interroger le contenu vidéo réel que nous voulons afficher sur la page. 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); Dans la vue matérialisée des vidéos récentes, la colonne 'created_at' est la clé primaire car nous filtrons par cette colonne dans notre première requête pour obtenir les valeurs de timestamp les plus récentes. . Partition chaude En outre, l'interface utilisateur affiche également une petite barre de progrès sous la miniature de chaque vidéo qui indique les progrès que vous avez réalisés en regardant cette vidéo. 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) ); Vous avez peut-être remarqué que la table de l'historique de l'horloge était déjà utilisée dans une requête précédente pour récupérer des données. Maintenant, cette fois, le schéma doit être légèrement modifié pour correspondre à cette requête. Ajoutez 'video_id' comme cluster. De cette façon, la requête pour récupérer le progrès de l'horloge fonctionnera correctement. Maintenant, voyons le schéma de base de données final! Schéma de base de données finale 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) ); Fonction définie par l'utilisateur pour la page Vidéos les plus récentes -- 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; Ceci Mais vous pourriez aussi Lors de la création de la fonction, assurez-vous d'activer les UDF dans le fichier de configuration scylla.yaml (location: /etc/scylla/scylla.yaml): UDF utilise la Lua Utilisez Wasm pour créer des UDF dans ScyllaDB Clonez le repo et commencez ! Pour commencer... Clonage du répertoire : git clone https://github.com/scylladb/video-streaming https://github.com/scylladb/video-streaming Mettre en place les dépendances : npm install Modifier le fichier de configuration : APP_BASE_URL="http://localhost:8000" SCYLLA_HOSTS="172.17.0.2" SCYLLA_USER="scylla" SCYLLA_PASSWD="xxxxx" SCYLLA_KEYSPACE="streaming" SCYLLA_DATACENTER="datacenter1" Migrez la base de données et insérez des données d'échantillon : npm run migrate Démarrer le serveur : npm run dev Envelopper le Nous espérons que vous apprécierez notre application de streaming vidéo et que cela vous aidera à construire des applications à faible latence et à haute performance avec ScyllaDB. où il y a des cours gratuits , à Si vous avez des questions sur l'application d'échantillonnage de streaming vidéo ou ScyllaDB, Et discutons ! Université ScyllaDB Modélisation de données Conducteurs ScyllaDB Allez sur notre forum Plus d'applications d'échantillon ScyllaDB : Général - IoT Cloud getting started guide Démarrer Caractéristiques Store Ressources pertinentes : Application de streaming vidéo GitHub repository Télécharger sur ScyllaDB Comment les agrégats distribués de ScyllaDB réduisent le temps d'exécution des requêtes jusqu'à 20X Wasmtime: Prise en charge des UDF dans ScyllaDB avec WebAssembly Documentaire ScyllaDB ScyllaDB se lance ScyllaDB se lance À propos d'Attila Tóth Il écrit des tutoriels et des articles de blog, parle à des événements, crée des démos et des applications d'échantillons pour aider les développeurs à construire des applications hautes performances. Attila Toth