We created a new video streaming app to help you learn about ScyllaDB. This blog covers its features, tech stack, and data modeling. Kami baru sahaja menerbitkan aplikasi sampel ScyllaDB baru, aplikasi streaming video. Blog ini merangkumi ciri-ciri aplikasi streaming video, stok teknologi, dan memecahkan proses pemodelan data. Tersedia di GitHub Ciri-ciri Aplikasi Streaming Video Aplikasi ini mempunyai reka bentuk minimal dengan ciri-ciri aplikasi streaming video yang paling penting: Senarai semua video, disusun mengikut tarikh penciptaan (halaman utama) Senarai video yang anda mula tonton Lihat Video Teruskan menonton video di mana anda berhenti Menunjukkan bar kemajuan di bawah setiap gambar kecil video Teknologi Stack Bahasa Pemrograman : TypeScript Pangkalan Data: ScyllaDB Kerangka kerja: NextJS (Pages Router) Perpustakaan komponen: Material_UI Menggunakan ScyllaDB untuk aplikasi streaming video latency rendah ScyllaDB adalah pangkalan data NoSQL berlatensi rendah dan prestasi tinggi yang bersesuaian dengan Apache Cassandra dan DynamoDB. Ia sesuai untuk menangani keperluan penyimpanan data skala besar dan pemulihan aplikasi streaming video. ScyllaDB mempunyai pemacu dalam semua bahasa pemrograman popular dan, seperti aplikasi sampel ini menunjukkan, ia bersepadu dengan kerangka kerja pembangunan web moden seperti NextJS. Latens yang rendah dalam konteks perkhidmatan streaming video adalah penting untuk menyampaikan pengalaman pengguna yang lancar. Untuk meletakkan asas untuk prestasi tinggi, anda perlu merekabentuk model data yang sesuai dengan keperluan anda. mari kita lanjutkan dengan proses pemodelan data contoh untuk melihat bagaimana ia kelihatan. Video streaming aplikasi model data Di dalam , kami mengajar bahawa pemodelan data NoSQL harus sentiasa bermula dengan aplikasi dan pertanyaan anda terlebih dahulu.Selepas itu anda bekerja ke belakang dan mencipta skim berdasarkan pertanyaan yang anda ingin menjalankan dalam aplikasi anda.Proses ini memastikan bahawa anda mencipta model data yang sesuai dengan pertanyaan anda dan memenuhi keperluan anda. Kursus Pemodelan Data Universiti ScyllaDB Dengan itu dalam fikiran, mari kita pergi ke atas pertanyaan yang aplikasi streaming video kami perlu berjalan pada setiap muat halaman! Kategori: Teruskan Menonton Pada halaman ini, anda boleh senarai semua video yang telah mereka mula menonton. pandangan ini termasuk miniatur video dan bar kemajuan di bawah miniatur. 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) ); Untuk pertanyaan ini, ia masuk akal untuk mendefinisikan 'user_id' sebagai kunci partisi kerana ia adalah filter yang kita gunakan untuk menginterogasi jadual sejarah jam. Ingat bahawa skim ini mungkin perlu dikemas kini kemudian jika terdapat pertanyaan yang memerlukan penapisan pada lajur lain di luar 'user_id'. Selain nilai kemajuan, aplikasi juga perlu mendapatkan metadata sebenar setiap video (contohnya, tajuk dan imej miniatur). Query – get video metadata: SELECT * FROM video WHERE id IN ?; Perhatikan bagaimana kita menggunakan operator “IN” dan bukan “=” kerana kita perlu mengambil senarai video bukan hanya satu video sahaja. 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) ); Untuk jadual video, mari kita mendefinisikan 'id' sebagai kunci partisi kerana ia adalah satu-satunya penapis yang kami gunakan dalam pertanyaan. Kategori: Lihat Video Jika anda klik pada mana-mana butang "Tonton", mereka akan dipindahkan ke halaman dengan pemutar video di mana mereka boleh memulakan dan menghentikan video. Query – get video content: SELECT * FROM video WHERE id = ?; Ini adalah pertanyaan yang sangat serupa dengan yang dijalankan pada halaman Continue Watching. Oleh itu, skim yang sama akan berfungsi dengan baik untuk pertanyaan ini juga. 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) ); Kategori: Video Terkini Akhirnya, mari kita memecahkan halaman Video Terkini, yang merupakan halaman utama aplikasi. Kami menganalisis halaman ini terakhir kerana ia adalah yang paling rumit daripada perspektif pemodelan data. Halaman ini menyenaraikan sepuluh video yang paling baru-baru ini dimuat naik yang boleh didapati dalam pangkalan data yang diatur oleh tarikh penciptaan video. Kami akan mempunyai untuk mengambil video ini dalam dua langkah: pertama mendapatkan timestamps, kemudian mendapatkan kandungan video sebenar. Query – get the most recent ten videos’ timestamp: SELECT id, top10(created_at) AS date FROM recent_videos; Anda mungkin memperhatikan bahawa kami menggunakan fungsi tersuai yang dipanggil `top10()`. Ini bukan fungsi standard dalam ScyllaDB. ) yang kami cipta untuk menyelesaikan masalah pemodelan data ini. fungsi ini mengembalikan rangkaian timestamp 'created_at' terkini dalam jadual. boleh menjadi cara yang hebat untuk menyelesaikan cabaran pemodelan data unik anda. Fungsi pengguna yang ditakrifkan Mencipta UDF baru dalam ScyllaDB Nilai timestamp ini kemudian boleh digunakan untuk menginterogasi kandungan video sebenar yang ingin kami tunjukkan pada halaman. 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); Dalam pandangan video baru-baru ini, lajur 'created_at' adalah kunci utama kerana kami menyaring mengikut lajur itu dalam pertanyaan pertama kami untuk mendapatkan nilai timestamp terkini. . Perbezaan panas Selain itu, UI juga memaparkan bar kemajuan kecil di bawah miniatur setiap video yang menunjukkan kemajuan yang anda buat menonton video itu. 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) ); Anda mungkin telah memperhatikan bahawa jadual sejarah menonton telah digunakan dalam pertanyaan terdahulu untuk mendapatkan data. Sekarang kali ini, skim mesti diubahsuai sedikit untuk sesuai dengan pertanyaan ini. Mari kita menambah 'video_id' sebagai kunci kumpulan. Dengan cara ini, pertanyaan untuk mendapatkan kemajuan menonton akan berfungsi dengan betul. Sekarang mari kita lihat skim pangkalan data akhir! Skim Database Akhir 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) ); Fungsi pengguna yang ditakrifkan untuk halaman Video Terkini -- 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; ini Tetapi anda juga boleh Mencipta fungsi pastikan untuk mengaktifkan UDFs dalam fail konfigurasi scylla.yaml (lokasi: /etc/scylla/scylla.yaml): UDF menggunakan Lua Gunakan Wasm untuk mencipta UDF dalam ScyllaDB Klon repo dan mula! Untuk memulakan... Kloning dalam repository: git clone https://github.com/scylladb/video-streaming https://github.com/scylladb/video-streaming Memperbaiki ketergantungan : npm install Mengubah fail konfigurasi: APP_BASE_URL="http://localhost:8000" SCYLLA_HOSTS="172.17.0.2" SCYLLA_USER="scylla" SCYLLA_PASSWD="xxxxx" SCYLLA_KEYSPACE="streaming" SCYLLA_DATACENTER="datacenter1" Migrasi pangkalan data dan masukkan data sampel: npm run migrate Menggunakan Server : npm run dev Membungkus Kami berharap anda menikmati aplikasi streaming video kami dan ia membantu anda membina aplikasi latensi rendah dan prestasi tinggi dengan ScyllaDB. Di mana kita mempunyai kursus percuma daripada Jika anda mempunyai soalan mengenai aplikasi sampel streaming video atau ScyllaDB, Mari kita bicarakan! Universiti ScyllaDB Model Data Pengendali ScyllaDB Pergi ke forum kami Lebih banyak ScyllaDB sample aplikasi: Perkhidmatan - IoT Cloud getting bermula panduan ciri-ciri besar Sumber yang relevan: Penggunaan GitHub Repository UDFs dalam ScyllaDB Bagaimana ScyllaDB Distributed Aggregates Mengurangkan masa pelaksanaan pertanyaan sehingga 20X Wasmtime: Menyokong UDF dalam ScyllaDB dengan WebAssembly Maklumat ScyllaDB ScyllaDB bermula ScyllaDB bermula daripada Attila Tóth Beliau menulis tutorial dan posting blog, bercakap di acara, mencipta demo dan sampel aplikasi untuk membantu pengembang membina aplikasi berkinerja tinggi. Aisyah Toh