का उपयोग करके प्लेलिस्ट के साथ एक म्यूजिक प्लेयर का आर्किटेक्चर, मैं एक ऐप विकसित कर रहा हूं जिसमें कई संगीत प्लेलिस्ट हैं, प्रत्येक प्लेलिस्ट और प्लेयर के लिए एक दृश्य है।रेल, रेडिस और एचटीएमएल 5
मैं अपने सिस्टम में पहले से ही (अन्य कार्यक्षमता के लिए) HTML5 History API का उपयोग कर रहा हूं और अनुरोधों के बीच पेज रीलोड को रोकने के लिए और इसलिए प्रत्येक पृष्ठ पर संगीत को रोकने के लिए इसका उपयोग कर रहा हूं।
मैं ट्रैक के प्रबंधन के लिए सबसे अच्छा तरीका के रूप में अटक गया हूं, हालांकि खिलाड़ी दृश्यों के बीच खेलेंगे। वर्तमान में, जैसा कि आप उम्मीद करेंगे, उपयोगकर्ता एक लिंक पर क्लिक करता है, ट्रैक की एक सूची प्राप्त करता है। पटरियों को खिलाड़ियों में लोड किया जाता है और अनुक्रमिक रूप से सरल, खेला जाता है। हालांकि, लगातार चल रहे संगीत के साथ मुझे पृष्ठ पर बदलती सामग्री के बावजूद ट्रैक की सही प्लेलिस्ट को क्रम में चलाने की ज़रूरत है और अब यह गतिशील यूआरएल है।
हालांकि, जब उपयोगकर्ता किसी अन्य पृष्ठ पर नेविगेट करता है, तो नई प्लेलिस्ट में एक ट्रैक पर प्रेस चलाते हैं, मुझे उस आइटम को प्लेयर में लोड करने में सक्षम होना चाहिए और शेष प्लेलिस्ट में प्रभावी रूप से लोड करना होगा जबकि उपयोगकर्ता जारी रहता है नेविगेट करने के लिए।
मैं ट्रैक के बीच अंतराल को कम करने के लिए त्वरित संदर्भ के लिए, प्लेलिस्ट के लिए ट्रैक आईडी की एक सूची स्टोर करने के लिए रेडिस का उपयोग कर रहा हूं। नतीजतन मेरे पास प्रत्येक प्लेलिस्ट के लिए एक अलग रेडिस सेट है। मैंने वर्तमान ट्रैक खेलने के आधार पर अपना अगला और पिछला ट्रैक एपीआई कॉल भी बनाया है, ताकि रेडिस सेट से अगला ट्रैक प्लेयर में लोड किया जा सके।
जैसा कि बताया गया है कि मैं इस बात का जिक्र करने का सबसे अच्छा तरीका तय नहीं कर सकता कि कौन सी प्लेलिस्ट वर्तमान में खेल रही है, इसलिए खिलाड़ी जानता है कि रेडिस ने ट्रैक को कॉल करने के लिए सेट किया था। मेरी सोच मुझे कुछ अलग विचारों के साथ छोड़ दिया है:
क) एचटीएमएल 5 कस्टम डेटा विशेषताओं - मैं खिलाड़ी पर एक डाटा-विशेषता के रूप में वर्तमान में चल रहे प्लेलिस्ट सेट और के रूप में और जब यह अद्यतन कर सकते हैं। जब मैं रेडिस से अपना अगला ट्रैक लोड करने के लिए सेट करता हूं तो मैं इस विशेषता का संदर्भ दे सकता हूं।
वैकल्पिक रूप से मैं वर्तमान प्लेलिस्ट, और सभी पटरियों (और उनके गुण) को जेएसओएन वस्तुओं के रूप में पृष्ठ पर डेटा विशेषताओं में डंप कर सकता था। प्लेलिस्ट लंबे समय तक हजारों ट्रैक हो सकती हैं, इसलिए मैं इसे एक खारिज कर रहा हूं क्योंकि स्रोत कोड भयानक लगेगा, अकेले संभावित प्रदर्शन मुद्दों को अकेले छोड़ दें। क्या मैं सही हू?
बी) लोकल स्टोरेज - क्रॉस ब्राउज़र समर्थन सीमित है। इस समाधान के लिए इस विशेष मामले में बेहतर समर्थन। इसके बावजूद मैं उपयोगकर्ता ब्राउज़र में वर्तमान प्लेलिस्ट को सहेज सकता हूं। इसने मुझे आश्चर्यचकित कर दिया है कि क्या अतिरिक्त डीबी कॉल को रोकने के लिए स्थानीय स्टोरेज में जेएसओएन ऑब्जेक्ट्स को ट्रैक करना भी व्यावहारिक होगा।
सी) सत्र में - मैं वर्तमान में प्लेलिस्ट के लिए एक चर स्टोर करने के लिए सत्र अपडेट कर सकता हूं।
डी) रेडिस - मैं वर्तमान प्लेलिस्ट के नाम का संदर्भ देने वाली स्ट्रिंग को सहेजने के लिए रेडिस के अपने उपयोग का विस्तार कर सकता हूं। मैं इसे प्रत्येक अगली/पिछली ट्रैक कॉल के बीच देख सकता था।
इस प्रश्न को लिखकर मुझे पहले से ही एक बेहतर विचार है कि मैं किस मार्ग पर जा रहा हूं लेकिन अगर किसी के पास इस परिदृश्य के लिए कोई सलाह है तो मुझे कृपया सुनना अच्छा लगेगा।
धन्यवाद।
अद्यतन: मैंने एक समाधान का 95% लागू किया है जो इसके लिए रेडिस का उपयोग करता है। मेरे पास कुछ प्रदर्शन समस्याएं हैं, हालांकि पृष्ठों को लोड करने के लिए ~ 10s लग रहा है। बिल्कुल अच्छा नहीं है।
अनिवार्य रूप से प्रत्येक उपयोगकर्ता के पास 2 प्लेलिस्ट हैं: वर्तमान और सशस्त्र। प्रत्येक अनुरोध ट्रैक आईडी को रेडिस सशस्त्र प्लेलिस्ट में लोड करता है और यदि प्ले बटन को ट्रैक पर दबाया जाता है, तो वर्तमान रेडिस प्लेलिस्ट समाप्त हो जाती है और सशस्त्र के साथ बदल दी जाती है।
मेरा अगला और पिछला बटन फिर वर्तमान प्लेलिस्ट में अगले या पिछले ट्रैक की आईडी प्राप्त करें और प्लेयर के लिए संगीत स्रोत में लोड करें। अवधारणा ठीक काम करती है और मैं इससे खुश हूं।
हालांकि, जैसा कि उल्लिखित प्रदर्शन पृष्ठ अनुरोधों के बीच धीमा है और इसमें महत्वपूर्ण सुधार की आवश्यकता है। मेरा एसक्यूएल अनुकूलित है, मैं केवल आवश्यक विशेषताओं को खींच रहा हूं और मेरे पास आवश्यक एसक्यूएल इंडेक्स हैं इसलिए मैं इस समय अन्य विकल्पों की तलाश में हूं।
विकल्प मैं विचार कर रहा हूँ:
केवल सशस्त्र प्लेलिस्ट पॉप्युलेट अगर एक ट्रैक नए पृष्ठ पर क्लिक किया जाता है। यदि उपयोगकर्ता वास्तव में नए ट्रैक में से किसी एक को सुनना नहीं चाहता है तो यह अतिरिक्त प्रसंस्करण को बचाएगा।
रेडिस का अधिक उपयोग करना और केवल ट्रैक आईडी के बजाय रेडिस प्लेलिस्ट के भीतर दुबला ट्रैक ऑब्जेक्ट्स संग्रहीत करना - प्रदर्शन अंतराल पृष्ठ अनुरोधों के बीच काफी हद तक है, न कि ट्रैक के वास्तविक खेल में और प्लेलिस्ट को नेविगेट करना।
एक मास्टर रेडिस प्लेलिस्ट का उपयोग करें जिसमें सभी एप्लिकेशन ट्रैक शामिल हैं, जिनमें से वर्तमान और सशस्त्र प्लेलिस्ट चुन सकते हैं। इसे एक घंटे के रेक कार्य के माध्यम से बनाए रखा जा सकता है और पेज अनुरोधों पर लंबी डीबी कॉल को रोक देगा। मुझे सिर्फ घबराहट है कि सर्वर पर मेमोरी उपयोग और डीबी में ट्रैक की मात्रा के मामले में यह कितना दूर होगा।
सुझाव पैट्रिक के लिए धन्यवाद। मैं अभी तक जावास्क्रिप्ट एमवीसी ढांचे को नीचे नहीं चला गया है, हालांकि मुझे कोई संदेह नहीं है कि सर्वर लोड को कम करने के लिए लाइन को थोड़ा और नीचे की आवश्यकता हो सकती है। – Pete