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 पर उपलब्ध वीडियो स्ट्रीमिंग ऐप ऐप में सबसे आवश्यक वीडियो स्ट्रीमिंग एप्लिकेशन सुविधाओं के साथ एक न्यूनतम डिजाइन है: सभी वीडियोों की सूची, निर्माण की तारीख के अनुसार वर्गीकृत ( होम पेज) वीडियो जो आपने देखना शुरू किया देखें वीडियो एक वीडियो देखें जहां आपने छोड़ दिया प्रत्येक वीडियो छोटे चित्र के नीचे एक प्रगति बार दिखाएं तकनीक Stack प्रोग्रामिंग भाषा: TypeScript डेटाबेस: ScyllaDB फ्रेमवर्क: NextJS (पेज राउटर) उपकरण पुस्तकालय: Material_UI कम लाटेंसी वीडियो स्ट्रीमिंग अनुप्रयोगों के लिए ScyllaDB का उपयोग करना ScyllaDB एक कम लाटेन और उच्च प्रदर्शन NoSQL डेटाबेस है जो Apache Cassandra और DynamoDB के साथ संगत है. यह वीडियो स्ट्रीमिंग अनुप्रयोगों के बड़े पैमाने पर डेटा भंडारण और रिकॉर्डिंग आवश्यकताओं को संभालने के लिए अच्छी तरह से उपयुक्त है. ScyllaDB में सभी लोकप्रिय प्रोग्रामिंग भाषाओं में ड्राइवर हैं और, जैसा कि यह नमूना अनुप्रयोग दिखाता है, यह आधुनिक वेब विकास फ्रेमवर्क जैसे NextJS के साथ अच्छी तरह से एकीकृत करता है। वीडियो स्ट्रीमिंग सेवाओं के संदर्भ में कम लाटेनता एक सुचारू उपयोगकर्ता अनुभव प्रदान करने के लिए महत्वपूर्ण है। उच्च प्रदर्शन के लिए नींव डालने के लिए, आपको एक डेटा मॉडल डिजाइन करने की आवश्यकता है जो आपकी जरूरतों के अनुरूप है। वीडियो स्ट्रीमिंग ऐप डेटा मॉडलिंग में , हम सिखाते हैं कि NoSQL डेटा मॉडलिंग हमेशा अपनी एप्लिकेशन और पूछताछ के साथ शुरू करना चाहिए. फिर आप वापस काम करते हैं और उन पूछताछ के आधार पर योजना बनाते हैं जिन्हें आप अपने ऐप में चलाना चाहते हैं. यह प्रक्रिया सुनिश्चित करती है कि आप एक डेटा मॉडल बनाते हैं जो आपकी पूछताछ को फिट करता है और आपकी आवश्यकताओं को पूरा करता है. ScyllaDB विश्वविद्यालय डेटा मॉडलिंग पाठ्यक्रम इस बात को ध्यान में रखते हुए, चलो पूछताछ पर जाते हैं कि हमारे वीडियो स्ट्रीमिंग ऐप को प्रत्येक पृष्ठ लोड पर चलाने की आवश्यकता है! पृष्ठ: देखते रहें इस पृष्ठ पर, आप उन सभी वीडियोों को सूचीबद्ध कर सकते हैं जिन्हें वे देखना शुरू कर चुके हैं. इस दृश्य में वीडियो छोटे चित्र और छोटे चित्र के नीचे प्रगति बार शामिल हैं. 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 पेज पर चलती है. इस प्रकार, एक ही योजना इस पूछताछ के लिए भी ठीक से काम करेगी. 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) ); पृष्ठ: सबसे हालिया वीडियो अंत में, सबसे हाल के वीडियो पृष्ठ को तोड़ दें, जो अनुप्रयोग का होम पेज है. हम इस पृष्ठ को अंतिम रूप से विश्लेषण करते हैं क्योंकि यह डेटा मॉडलिंग परिप्रेक्ष्य से सबसे जटिल है. यह पृष्ठ सबसे हाल ही में अपलोड किए गए वीडियो के दस को सूचीबद्ध करता है जो वीडियो बनाने की तारीख से क्रमबद्ध डेटाबेस में उपलब्ध हैं. हमें इन वीडियो को दो चरणों में उठाना होगा: पहले टाइमस्टैम्प प्राप्त करें, फिर वास्तविक वीडियो सामग्री प्राप्त करें। Query – get the most recent ten videos’ timestamp: SELECT id, top10(created_at) AS date FROM recent_videos; आप देख सकते हैं कि हम 'top10()' नामक एक कस्टम फ़ंक्शन का उपयोग करते हैं. यह ScyllaDB में एक मानक फ़ंक्शन नहीं है. यह एक UDF है ( ) हमने इस डेटा मॉडलिंग समस्या को हल करने के लिए बनाया है. यह कार्य तालिका में नवीनतम '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' कॉलम प्राथमिक कुंजी है क्योंकि हम अपने पहले पूछताछ में उस कॉलम द्वारा फ़िल्टर करते हैं ताकि नवीनतम टाइमस्टैम्प मूल्यों को प्राप्त किया जा सके। . गर्म विभाजन इसके अलावा, यूआई प्रत्येक वीडियो के छोटे चित्र के नीचे एक छोटा प्रगति बार भी दिखाता है जो कि उस वीडियो को देखने के लिए आपके द्वारा किए गए प्रगति को इंगित करता है। 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) ); आपने देखा हो सकता है कि घड़ी इतिहास तालिका पहले से ही डेटा प्राप्त करने के लिए एक पिछली पूछताछ में उपयोग की गई थी. अब इस बार, इस पूछताछ को फिट करने के लिए योजना को थोड़ा संशोधित किया जाना चाहिए. चलो '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 कॉन्फ़िगरेशन फ़ाइल में UDFs सक्षम करें (स्थिति: /etc/scylla/scylla.yaml): चंद्रमा का उपयोग करें ScyllaDB में UDFs बनाने के लिए Wasm का उपयोग करें रेप को क्लोन करें और शुरू करें! शुरू करने के लिए... रजिस्टर को क्लोन करें: 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 कवर करें हम आशा करते हैं कि आप हमारे वीडियो स्ट्रीमिंग ऐप का आनंद लेंगे और यह आपको ScyllaDB के साथ कम लाटेन और उच्च प्रदर्शन ऐप्स का निर्माण करने में मदद करेगा। जहां मुफ्त कक्षाएं हैं , , और बहुत कुछ! यदि आपके पास वीडियो स्ट्रीमिंग नमूने ऐप या ScyllaDB के बारे में प्रश्न हैं, चलो बात करते हैं! ScyllaDB विश्वविद्यालय डेटा मॉडल ScyllaDB ड्राइवर हमारे मंच पर जाएं अधिक ScyllaDB नमूने अनुप्रयोग: आईओटी - आईओटी शुरुआत करने के लिए Cloud getting started guide बड़ी विशेषताएं प्रासंगिक संसाधन: वीडियो स्ट्रीमिंग एप्लिकेशन GitHub Repository ScyllaDB में UDFs कैसे ScyllaDB वितरित Aggregates 20X तक Query Execution Time को कम करते हैं Wasmtime: WebAssembly के साथ ScyllaDB में UDFs का समर्थन करना ScyllaDB दस्तावेज ScyllaDB शुरू हो रहा है ScyllaDB शुरू हो रहा है Attila Tóth के बारे में वह ScyllaDB में एक डेवलपर्स वकील हैं. वह ट्यूटोरियल और ब्लॉग पोस्ट लिखते हैं, घटनाओं पर बोलते हैं, डेमो बनाते हैं और डेवलपर्स को उच्च प्रदर्शन एप्लिकेशन बनाने में मदद करते हैं। एथलीट टॉथ