We created a new video streaming app to help you learn about ScyllaDB. This blog covers its features, tech stack, and data modeling. 新しい ScyllaDB サンプルアプリケーション、ビデオストリーミングアプリケーションをリリースしました。 このブログでは、ビデオストリーミングアプリケーションの機能、テクノロジースタック、およびデータモデリングプロセスをカバーします。 GitHubで利用可能 ビデオストリーミングアプリの機能 アプリは、最も重要なビデオストリーミングアプリケーション機能を持つ最小限のデザインを持っています: List all videos, sorted by creation date (ホームページ) 見始めた動画一覧 ビデオ見る Continue to watch a video where you left 各ビデオのミニ画像の下に進捗バーを表示する テクノロジ Stack プログラミング言語:TypeScript データベース:ScyllaDB NextJS(ページルーター) コンポーネント ライブラリ: Material_UI ScyllaDB を使用して低遅延ビデオストリーミングアプリケーション ScyllaDBは、Apache CassandraとDynamoDBと互換性のある低遅延と高性能のNoSQLデータベースで、ビデオストリーミングアプリケーションの大規模なデータストレージおよび回収要件に対処するのに適しています。 ビデオストリーミングサービスの文脈における低い遅延は、シームレスなユーザーエクスペリエンスを提供するために不可欠です。高パフォーマンスの基盤を築くには、あなたのニーズに合ったデータモデルを設計する必要があります。 ビデオストリーミングアプリデータモデリング IN THE , we teach that NoSQL data modeling should always start with your application and queries first. Then you work backwards and create the scheme based on the queries you want to run in your app. This process ensures that you create a data model that fits your queries and meets your requirements. NoSQLデータモデリングは、常にあなたのアプリケーションとクエリを最初に始めるべきです。 ScyllaDB大学データモデリングコース それを念頭に置いて、私たちのビデオストリーミングアプリが各ページのロードで実行する必要があるクエリについて行きましょう! ページ名: 続きを読む このページでは、彼らが視聴し始めたすべてのビデオをリストすることができます. This view includes the video thumbnails and the progress bar under the thumbnail. 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) ); このクエリでは、「user_id」を「user_id」以外の列にフィルターを必要とするクエリがある場合、このスケジュールを後で更新する必要があることを覚えておいてください。 進捗値に加えて、アプリは各ビデオの実際のメタデータ(タイトルやミニ画像など)を取得する必要があります。 Query – get video metadata: SELECT * FROM video WHERE id IN ?; 我々が単一のビデオではなく、ビデオのリストを取得する必要があるので、「IN」操作子ではなく「=」を使用することに注意してください。 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) ); ビデオテーブルでは、「id」をパーティションキーとして定義しますが、これはクエリで使用する唯一のフィルターです。 ページ: 動画を見る あなたが「見る」ボタンをクリックすると、彼らはビデオプレーヤーを持つページにリダイレクトされ、ビデオを開始して停止することができます。 Query – get video content: SELECT * FROM video WHERE id = ?; これは、Continue Watching ページで実行されているクエリと非常に似たクエリです. Therefore, the same scheme will work just fine for this query as well. 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) ); ページ名: 最近の動画 最後に、アプリケーションのホームページである最も最近のビデオページを分解します。このページは、データモデリングの観点から最も複雑なものであるため、最後にこのページを分析します。 これらのビデオを2つのステップで取得する必要があります:最初にタイムスタンプを取得し、次に実際のビデオコンテンツを取得します。 Query – get the most recent ten videos’ timestamp: SELECT id, top10(created_at) AS date FROM recent_videos; タイトルは「TOP10(トップ10)」で、この機能はScylaDBの標準機能ではありません。 この関数は、テーブル内の最も最近の 'created_at' タイムスタンプの数値を返します。 あなたのユニークなデータモデリングの課題を解決するための素晴らしい方法です。 ユーザ定義機能 ScyllaDB で新しい UDF を作成する これらのタイムスタンプ値は、ページに表示したい実際のビデオコンテンツをクエリするために使用できます。 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); 最近のビデオの現実化されたビューでは、「created_at」列が主なキーであるため、最初のクエリでその列によってフィルタリングして、最新のタイムスタンプ値を取得します。 . ホットパーティション さらに、UI は各ビデオのミニ画像の下に小さな進捗バーを表示し、そのビデオを視聴した進捗状況を示します。 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) ); 以前のクエリでデータを取得するためにすでに時計履歴表が使用されていたことに気づいたことがあるかもしれません。今度は、このクエリに適合するためにスケジュールを少し変更する必要があります。 では、最終データベースのスケジュールを見てみましょう! 最終データベース 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; この しかし、あなたはまた、 機能を作成すると、scylla.yaml 構成ファイルの UDF を有効にします(位置: /etc/scylla/scylla.yaml): UDFはLuaを使っています。 Wasm を使用して ScyllaDB で UDF を作成する レポをクローンして始める! 始めるには... リポジトリをクローン化する: git clone https://github.com/scylladb/video-streaming 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 Wrapping Up 私たちは、あなたが私たちのビデオストリーミングアプリを楽しむことを希望し、それはあなたがScyllaDBで低遅延と高パフォーマンスのアプリケーションを構築するのに役立ちます。 Where we have free courses on 無料コース で、 ビデオストリーミングサンプルアプリやScyllaDBについて質問がある場合は、 話し合おう! ScyllaDB大学 データモデリング ScyllaDBドライバー GO TO OUR FORUM ScyllaDB サンプルアプリケーション: トップ > IoT Cloud Getting Started ガイド Feature ストア 関連資源: ビデオストリーミングアプリ GitHub repository UDFs in ScyllaDB ScyllaDB Distributed Aggregates がクエリ実行時間を最大 20 倍削減する方法 Wasmtime: WebAssembly で ScyllaDB の UDF をサポートする ScyllaDB ドキュメンタリー ScyllaDBがスタート ScyllaDBがスタート Attila Tóthについて ScyllaDBの開発者弁護士で、チュートリアルやブログ記事を書き、イベントでスピーチし、デモやサンプルアプリを作成し、開発者が高性能なアプリケーションを構築するのを助ける。 アッティラ・トース