2012-01-28 20 views
9

का उपयोग करके प्लेलिस्ट के साथ एक म्यूजिक प्लेयर का आर्किटेक्चर, मैं एक ऐप विकसित कर रहा हूं जिसमें कई संगीत प्लेलिस्ट हैं, प्रत्येक प्लेलिस्ट और प्लेयर के लिए एक दृश्य है।रेल, रेडिस और एचटीएमएल 5

मैं अपने सिस्टम में पहले से ही (अन्य कार्यक्षमता के लिए) HTML5 History API का उपयोग कर रहा हूं और अनुरोधों के बीच पेज रीलोड को रोकने के लिए और इसलिए प्रत्येक पृष्ठ पर संगीत को रोकने के लिए इसका उपयोग कर रहा हूं।

मैं ट्रैक के प्रबंधन के लिए सबसे अच्छा तरीका के रूप में अटक गया हूं, हालांकि खिलाड़ी दृश्यों के बीच खेलेंगे। वर्तमान में, जैसा कि आप उम्मीद करेंगे, उपयोगकर्ता एक लिंक पर क्लिक करता है, ट्रैक की एक सूची प्राप्त करता है। पटरियों को खिलाड़ियों में लोड किया जाता है और अनुक्रमिक रूप से सरल, खेला जाता है। हालांकि, लगातार चल रहे संगीत के साथ मुझे पृष्ठ पर बदलती सामग्री के बावजूद ट्रैक की सही प्लेलिस्ट को क्रम में चलाने की ज़रूरत है और अब यह गतिशील यूआरएल है।

हालांकि, जब उपयोगकर्ता किसी अन्य पृष्ठ पर नेविगेट करता है, तो नई प्लेलिस्ट में एक ट्रैक पर प्रेस चलाते हैं, मुझे उस आइटम को प्लेयर में लोड करने में सक्षम होना चाहिए और शेष प्लेलिस्ट में प्रभावी रूप से लोड करना होगा जबकि उपयोगकर्ता जारी रहता है नेविगेट करने के लिए।

मैं ट्रैक के बीच अंतराल को कम करने के लिए त्वरित संदर्भ के लिए, प्लेलिस्ट के लिए ट्रैक आईडी की एक सूची स्टोर करने के लिए रेडिस का उपयोग कर रहा हूं। नतीजतन मेरे पास प्रत्येक प्लेलिस्ट के लिए एक अलग रेडिस सेट है। मैंने वर्तमान ट्रैक खेलने के आधार पर अपना अगला और पिछला ट्रैक एपीआई कॉल भी बनाया है, ताकि रेडिस सेट से अगला ट्रैक प्लेयर में लोड किया जा सके।

जैसा कि बताया गया है कि मैं इस बात का जिक्र करने का सबसे अच्छा तरीका तय नहीं कर सकता कि कौन सी प्लेलिस्ट वर्तमान में खेल रही है, इसलिए खिलाड़ी जानता है कि रेडिस ने ट्रैक को कॉल करने के लिए सेट किया था। मेरी सोच मुझे कुछ अलग विचारों के साथ छोड़ दिया है:

क) एचटीएमएल 5 कस्टम डेटा विशेषताओं - मैं खिलाड़ी पर एक डाटा-विशेषता के रूप में वर्तमान में चल रहे प्लेलिस्ट सेट और के रूप में और जब यह अद्यतन कर सकते हैं। जब मैं रेडिस से अपना अगला ट्रैक लोड करने के लिए सेट करता हूं तो मैं इस विशेषता का संदर्भ दे सकता हूं।

वैकल्पिक रूप से मैं वर्तमान प्लेलिस्ट, और सभी पटरियों (और उनके गुण) को जेएसओएन वस्तुओं के रूप में पृष्ठ पर डेटा विशेषताओं में डंप कर सकता था। प्लेलिस्ट लंबे समय तक हजारों ट्रैक हो सकती हैं, इसलिए मैं इसे एक खारिज कर रहा हूं क्योंकि स्रोत कोड भयानक लगेगा, अकेले संभावित प्रदर्शन मुद्दों को अकेले छोड़ दें। क्या मैं सही हू?

बी) लोकल स्टोरेज - क्रॉस ब्राउज़र समर्थन सीमित है। इस समाधान के लिए इस विशेष मामले में बेहतर समर्थन। इसके बावजूद मैं उपयोगकर्ता ब्राउज़र में वर्तमान प्लेलिस्ट को सहेज सकता हूं। इसने मुझे आश्चर्यचकित कर दिया है कि क्या अतिरिक्त डीबी कॉल को रोकने के लिए स्थानीय स्टोरेज में जेएसओएन ऑब्जेक्ट्स को ट्रैक करना भी व्यावहारिक होगा।

सी) सत्र में - मैं वर्तमान में प्लेलिस्ट के लिए एक चर स्टोर करने के लिए सत्र अपडेट कर सकता हूं।

डी) रेडिस - मैं वर्तमान प्लेलिस्ट के नाम का संदर्भ देने वाली स्ट्रिंग को सहेजने के लिए रेडिस के अपने उपयोग का विस्तार कर सकता हूं। मैं इसे प्रत्येक अगली/पिछली ट्रैक कॉल के बीच देख सकता था।

इस प्रश्न को लिखकर मुझे पहले से ही एक बेहतर विचार है कि मैं किस मार्ग पर जा रहा हूं लेकिन अगर किसी के पास इस परिदृश्य के लिए कोई सलाह है तो मुझे कृपया सुनना अच्छा लगेगा।

धन्यवाद।

अद्यतन: मैंने एक समाधान का 95% लागू किया है जो इसके लिए रेडिस का उपयोग करता है। मेरे पास कुछ प्रदर्शन समस्याएं हैं, हालांकि पृष्ठों को लोड करने के लिए ~ 10s लग रहा है। बिल्कुल अच्छा नहीं है।

अनिवार्य रूप से प्रत्येक उपयोगकर्ता के पास 2 प्लेलिस्ट हैं: वर्तमान और सशस्त्र। प्रत्येक अनुरोध ट्रैक आईडी को रेडिस सशस्त्र प्लेलिस्ट में लोड करता है और यदि प्ले बटन को ट्रैक पर दबाया जाता है, तो वर्तमान रेडिस प्लेलिस्ट समाप्त हो जाती है और सशस्त्र के साथ बदल दी जाती है।

मेरा अगला और पिछला बटन फिर वर्तमान प्लेलिस्ट में अगले या पिछले ट्रैक की आईडी प्राप्त करें और प्लेयर के लिए संगीत स्रोत में लोड करें। अवधारणा ठीक काम करती है और मैं इससे खुश हूं।

हालांकि, जैसा कि उल्लिखित प्रदर्शन पृष्ठ अनुरोधों के बीच धीमा है और इसमें महत्वपूर्ण सुधार की आवश्यकता है। मेरा एसक्यूएल अनुकूलित है, मैं केवल आवश्यक विशेषताओं को खींच रहा हूं और मेरे पास आवश्यक एसक्यूएल इंडेक्स हैं इसलिए मैं इस समय अन्य विकल्पों की तलाश में हूं।

विकल्प मैं विचार कर रहा हूँ:

  1. केवल सशस्त्र प्लेलिस्ट पॉप्युलेट अगर एक ट्रैक नए पृष्ठ पर क्लिक किया जाता है। यदि उपयोगकर्ता वास्तव में नए ट्रैक में से किसी एक को सुनना नहीं चाहता है तो यह अतिरिक्त प्रसंस्करण को बचाएगा।

  2. रेडिस का अधिक उपयोग करना और केवल ट्रैक आईडी के बजाय रेडिस प्लेलिस्ट के भीतर दुबला ट्रैक ऑब्जेक्ट्स संग्रहीत करना - प्रदर्शन अंतराल पृष्ठ अनुरोधों के बीच काफी हद तक है, न कि ट्रैक के वास्तविक खेल में और प्लेलिस्ट को नेविगेट करना।

  3. एक मास्टर रेडिस प्लेलिस्ट का उपयोग करें जिसमें सभी एप्लिकेशन ट्रैक शामिल हैं, जिनमें से वर्तमान और सशस्त्र प्लेलिस्ट चुन सकते हैं। इसे एक घंटे के रेक कार्य के माध्यम से बनाए रखा जा सकता है और पेज अनुरोधों पर लंबी डीबी कॉल को रोक देगा। मुझे सिर्फ घबराहट है कि सर्वर पर मेमोरी उपयोग और डीबी में ट्रैक की मात्रा के मामले में यह कितना दूर होगा।

उत्तर

0

मैं सुझाव दूंगा सी) सत्र में।
सत्र डेटा को क्लाइंट और सर्वर दोनों पक्षों के सापेक्ष आसानी से एक्सेस किया जा सकता है।

विशिष्ट उपयोगकर्ता डेटा के साथ अपना रेडिस कैश भरना विशेष रूप से अच्छी तरह से स्केल नहीं करता है।

लोकल स्टोरेज - सही, यह वर्तमान तिथि पर उपयोगकर्ताओं के एक बड़े% के लिए असफल हो जाएगा।

कस्टमडाटा विशेषताएँ - जैसा कि उल्लेख किया गया है, केवल सादा गन्दा है।

बस मेरे 2 सेंट।

1

यदि आपको क्लाइंट-साइड एप्लिकेशन स्थिति मॉडल करने की आवश्यकता है तो राज्य का एक स्रोत होना सर्वोत्तम है। क्लाइंट साइड जावास्क्रिप्ट एमवी (वी) सी ढांचे को हल करने का प्रयास करने वाली समस्याओं में से एक यह है। मैं ज्यादातर backbone.js और ember.js से परिचित हूं इसलिए मैं उनसे बात कर सकता हूं।

Backbone.js

एक मॉडल Playlist कहा जाता है और एक संग्रह Playlists बुलाया बनाएँ। अपनी Playlists संग्रह currentPlaylist पर एक संपत्ति जोड़ें जो वर्तमान प्लेलिस्ट रखती है। फिर PlaylistView नामक एक दृश्य को परिभाषित करें और उस पर render विधि परिभाषित करें।ईवेंट ट्रिगर्स और बाइंडिंग को वायर करें जैसे कि currentPlaylist परिवर्तन, प्लेलिस्ट स्वचालित रूप से फिर से प्रस्तुत की जाती है। इसके लिए क्लाइंट को आपके टेम्पलेट प्रतिपादन को स्थानांतरित करने की आवश्यकता होगी, लेकिन शायद आप सर्वर राउंडट्रिप्स को कम करने और प्रतिपादन के कारण सर्वर पर लोड को कम करने के लिए ऐसा करना चाहते हैं।

Ember.js

एक संपत्ति currentPlaylist कहा जाता है के साथ एक नियंत्रक (रीढ़ की हड्डी संग्रह के समान) बनाएं और प्लेलिस्ट Ember.object रों के रूप में प्रतिनिधित्व के सभी के साथ नियंत्रक को पॉप्युलेट। फिर पेज पर शामिल प्लेलिस्ट हैंडलबर्स टेम्पलेट में आप playlists.currentPlaylist पर बाध्य कर सकते हैं और playlists.currentPlaylist परिवर्तनों पर टेम्पलेट स्वचालित रूप से फिर से प्रस्तुत हो जाएगा।

मैं स्पष्ट रूप से विवरणों का विशाल बहुमत छोड़ रहा हूं, लेकिन फ्रेमवर्क दस्तावेज, उदाहरण और ट्यूटोरियल सबसे अच्छे हैं।

अस्वीकरण: मैं क्लाइंट-साइड फ्रेमवर्क के लिए नया हूं जो कि अधिकांश विवरणों को छोड़ने का कारण है। मैं किसी भी व्यक्ति की सराहना करता हूं जो मुझे त्रुटि में पड़ने पर सही कर सकता है।

+0

सुझाव पैट्रिक के लिए धन्यवाद। मैं अभी तक जावास्क्रिप्ट एमवीसी ढांचे को नीचे नहीं चला गया है, हालांकि मुझे कोई संदेह नहीं है कि सर्वर लोड को कम करने के लिए लाइन को थोड़ा और नीचे की आवश्यकता हो सकती है। – Pete

1

सत्र और स्थानीय भंडारण का मिश्रण एक अच्छा दृष्टिकोण होगा।

लेकिन पूरी प्लेलिस्ट लाने के बजाय बस एक्स (उदाहरण के लिए 10) अगले ट्रैक और शायद पिछले एक्स को भी लाएं। एक बार जब खिलाड़ी अंतिम गीत में जाता है, तो यह अगले 10 गाने लाता है, पिछले लोगों की गणना क्लाइंट में की जा सकती है।

डेटा मॉडल केवल एक हैश हो सकता है जहां तत्व [0] वर्तमान गीत है, तत्व [एक्स] अगले गाने हैं और [-X] पिछले वाले हैं।

प्लेलिस्ट जानकारी क्लाइंट-साइड संग्रह करना मेरे लिए उचित लगता है, लेकिन आप मौजूदा गीत और प्लेलिस्ट को संदर्भित करने के लिए सत्र का भी उपयोग कर सकते हैं, इसलिए जब कोई उपयोगकर्ता वापस आ जाता है या वास्तव में आपकी साइट को पुनः लोड करता है तो भी आपको बिना गाने किए गीत मिल जाता है डेटाबेस कॉल

+0

यह वास्तव में जिस दृष्टिकोण के साथ चला गया है उसके समान लगता है। मुझे प्रदर्शन के साथ कुछ समस्याएं आ रही हैं, हालांकि मैं वास्तव में पूरी प्लेलिस्ट ला रहा हूं, जो वर्तमान में धीमी गति से चल रहा है क्योंकि प्रत्येक प्लेलिस्ट में अधिक से अधिक ट्रैक जोड़े जाते हैं। जैसा कि आपने सुझाव दिया है, मैं लागू करने के बीच में हूं, हालांकि अगले 10 ट्रैक या तो बस ला रहा हूं और जब मैं आखिरी तक पहुंचता हूं, तो कुछ और पकड़ लें। सलाह के लिये धन्यवाद। – Pete

+0

आपका स्वागत है :) – yagooar

संबंधित मुद्दे