2012-03-16 19 views
157

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

तो ... कि हमारे पास कुछ आवश्यकताओं:

  • चरम पर कई बार हमारे पास के बारे में 1k समवर्ती लॉग-इन उपयोगकर्ताओं (और कई और अधिक मेहमानों, लेकिन उन्होंने इस मामले यहाँ वे नहीं होगा के रूप में नहीं है अधिसूचनाएं) जो कई घटनाएं उत्पन्न करेगी
  • विभिन्न प्रकार की अधिसूचनाएं होंगी (उपयोगकर्ता ए ने आपको एक दोस्त के रूप में जोड़ा है, उपयोगकर्ता बी ने आपकी प्रोफ़ाइल पर टिप्पणी की है, उपयोगकर्ता सी ने आपकी छवि पसंद की है, उपयोगकर्ता डी ने आपको गेम एक्स पर पीटा है , ...)
  • अधिकतर ईवेंट 1 उपयोगकर्ता के लिए 1 अधिसूचना उत्पन्न करेंगे (उपयोगकर्ता एक्स ने आपकी छवि पसंद की है), लेकिन ऐसे मामले होंगे जहां कोई भी टी कई अधिसूचनाएं उत्पन्न करेगा (उदाहरण के लिए यह उपयोगकर्ता वाई का जन्मदिन है)
  • सूचनाओं को एक साथ समूहीकृत किया जाना चाहिए; अगर उदाहरण के चार अलग-अलग उपयोगकर्ताओं को कुछ छवि की तरह के लिए, उस छवि के मालिक करते हुए कहा कि चार उपयोगकर्ताओं छवि और नहीं चार अलग-अलग सूचनाएं (जैसे अमेरिकन प्लान करता है)

ठीक तो मैं क्या सोच रहा था पसंद किया है एक अधिसूचना मिलना चाहिए यह है कि मुझे कुछ प्रकार की कतार बनाना चाहिए जहां मैं घटनाओं को संग्रहीत करता हूं। तो मेरे पास पृष्ठभूमि की नौकरी होगी (gearman?) जो उस कतार को देखेंगे और उन घटनाओं के आधार पर अधिसूचनाएं उत्पन्न करेगी। यह नौकरी प्रत्येक उपयोगकर्ता के लिए डेटाबेस में सूचनाएं संग्रहीत करेगी (इसलिए यदि कोई ईवेंट 10 उपयोगकर्ताओं को प्रभावित करता है, तो 10 अलग-अलग अधिसूचनाएं होंगी)। फिर जब उपयोगकर्ता अधिसूचनाओं की सूची के साथ एक पृष्ठ खोलता है तो मैं उनके लिए उन सभी अधिसूचनाओं को पढ़ता हूं (हम इसे 100 नवीनतम अधिसूचनाओं तक सीमित करने के बारे में सोचते हैं) और उन्हें एक साथ समूहित करते हैं और फिर अंततः उन्हें प्रदर्शित करते हैं।

हालात मैं इस दृष्टिकोण के साथ को लेकर चिंतित हूं:

  • नरक :) के रूप में जटिल
  • डेटाबेस सबसे अच्छा भंडारण यहाँ (हम MySQL का उपयोग कर रहे हैं) या मैं कुछ और का उपयोग करना चाहिए (redis की तरह लगता है
  • है एक अच्छा फिट भी)
  • मुझे अधिसूचना के रूप में क्या स्टोर करना चाहिए? यूजर आईडी, यूजर आईडी जिसने इवेंट शुरू किया, इवेंट का प्रकार (ताकि मैं उन्हें समूहित कर सकूं और उपयुक्त टेक्स्ट प्रदर्शित कर सकूं) लेकिन फिर मुझे नहीं पता कि अधिसूचना के वास्तविक डेटा को कैसे स्टोर किया जाए (उदाहरण के लिए यूआरएल & शीर्षक छवि पसंद आया था)। अगर मैं अधिसूचना उत्पन्न करता हूं तो मुझे उस जानकारी को "सेंकना" चाहिए, या मुझे रिकॉर्ड (छवि, प्रोफ़ाइल, ...) की आईडी को प्रभावित करना चाहिए और अधिसूचना प्रदर्शित करते समय डीबी से जानकारी खींचना चाहिए।
  • प्रदर्शन यहाँ ठीक होना चाहिए, मैं ऑन-द-फ्लाई 100 सूचनाएं कार्रवाई करने के लिए है, भले ही जब हर अनुरोध पर सूचनाएं पेज
  • संभव प्रदर्शन समस्या प्रदर्शित क्योंकि मैं उपयोगकर्ता के लिए अपठित सूचनाओं की संख्या प्रदर्शित करने के लिए होता है (जो स्वयं में एक समस्या हो सकती है क्योंकि मैं एक साथ अधिसूचनाओं को समूहबद्ध करता हूं)। यह बचा जा सकता है, हालांकि अगर मैं पृष्ठभूमि में सूचनाएं (जहां वे वर्गीकृत किया है) के मद्देनजर उत्पन्न होती है और न ऑन-द-मक्खी

तो क्या तुम मेरे प्रस्तावित समाधान और मेरी चिंताओं के बारे में सोचते हैं? कृपया टिप्पणी करें यदि आपको लगता है कि मुझे कुछ और उल्लेख करना चाहिए जो यहां प्रासंगिक होगा।

ओह, हम अपने पृष्ठ के लिए PHP का उपयोग कर रहे हैं, लेकिन यह मुझे लगता है कि यह एक बड़ा कारक नहीं होना चाहिए।

+0

इस अधिसूचना प्रणाली को एक व्यक्ति के प्रयासों के रूप में बनाने में आपको कितना समय लगेगा। मैं सिर्फ तदनुसार समय सारिणी बनाने का अनुमान रखना चाहता हूं। – Shaharyar

+0

@ शाहरारी मुझे लगता है कि यह अधिसूचना प्रणाली की जटिलता पर निर्भर करता है। – tyan

+0

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

उत्तर

154

एक सूचना किसी को (अभिनेता) द्वारा बदला जा रहा कुछ के बारे में है (वस्तु = घटना, दोस्ती ..) (क्रिया = कहा, अनुरोध किया ..) और उपयोगकर्ता (विषय) को सूचना दी। यहां एक सामान्यीकृत डेटा संरचना है (हालांकि मैंने मोंगोडीबी का उपयोग किया है)। आपको कुछ उपयोगकर्ताओं को परिवर्तनों के बारे में सूचित करने की आवश्यकता है। तो यह प्रति उपयोगकर्ता सूचनाएं है .. जिसका अर्थ है कि यदि 100 उपयोगकर्ता शामिल थे, तो आप 100 अधिसूचनाएं उत्पन्न करते हैं।

╔═════════════╗  ╔═══════════════════╗  ╔════════════════════╗ 
║notification ║  ║notification_object║  ║notification_change ║ 
╟─────────────╢  ╟───────────────────╢  ╟────────────────────╢ 
║ID   ║—1:n—→║ID     ║—1:n—→║ID     ║ 
║userID  ║  ║notificationID  ║  ║notificationObjectID║ 
╚═════════════╝  ║object    ║  ║verb    ║ 
        ╚═══════════════════╝  ║actor    ║ 
               ╚════════════════════╝ 

यह इतना है कि आप कह सकते हैं "आप 3 मित्र अनुरोध हैं", वस्तु प्रति परिवर्तन समूहीकरण के लिए मूल रूप से है (समय क्षेत्रों जहां आपको योग्य जोड़े)। और प्रति अभिनेता समूहिंग उपयोगी है, ताकि आप कह सकें "उपयोगकर्ता जेम्स बॉन्ड ने आपके बिस्तर में बदलाव किए हैं"। यह आपकी पसंद के अनुसार अधिसूचनाओं का अनुवाद और गिनती करने की क्षमता भी देता है।

लेकिन, चूंकि वस्तु केवल एक आईडी है, इसलिए आपको ऑब्जेक्ट के बारे में सभी अतिरिक्त जानकारी प्राप्त करने की आवश्यकता होगी, जब तक आप वास्तव में परिवर्तन नहीं करते हैं और आप उस इतिहास को दिखाना चाहते हैं (उदाहरण के लिए "उपयोगकर्ता ने ईवेंट का शीर्षक बदल दिया करने के लिए ... ")

चूंकि नोटिफिकेशन साइट पर उपयोगकर्ताओं के लिए रीयलटाइम के करीब हैं, इसलिए मैं उन सभी श्रोताओं के लिए नोडजेस को php pushing अद्यतन के साथ nodejs + websockets क्लाइंट के साथ जोड़ दूंगा क्योंकि परिवर्तन जोड़ा जाता है।

+0

+1 @ आर्टजॉम, यह एक शानदार पोस्ट है। मैं सोच रहा था, आप 'ऑब्जेक्ट' का उल्लेख सिर्फ एक आईडी है। आप कैसे जानते हैं कि यह किस प्रकार की वस्तु है? उदाहरण के लिए यह एक मित्र अनुरोध हो सकता है, या कुछ और, तो आप अधिसूचना को उचित घटना से कैसे जोड़ सकते हैं? बहुत धन्यवाद – Mick

+1

notification_object.object एक प्रकार की स्ट्रिंग "दोस्ती" जैसे परिवर्तन प्रकार की पहचान करता है, इसके बारे में मैं अपने अतिरिक्त डेटा के साथ परिवर्तित ऑब्जेक्ट का वास्तविक संदर्भ अधिसूचना_change.notificationObjectID –

+0

में देखता हूं, यह बहुत स्मार्ट है। तो, क्या आपको कभी भी डेटाबेस में कहीं भी ऑब्जेक्ट की कक्षा को स्टोर करने की आवश्यकता है? या आपके पास 'notification_object.object' (जैसे 'दोस्ती' में संग्रहीत स्ट्रिंग से कक्षा को पुनर्प्राप्त करने का कोई तरीका है? क्योंकि, अगर हम अधिसूचना ऑब्जेक्ट पर कुछ जानकारी प्राप्त करना चाहते हैं, तो हमें इसे अपनी कक्षा और इसके पहचानकर्ताओं का उपयोग करके लोड करना होगा। क्या मैं सही हू? क्या आपके पास इसके लिए एक चाल है? एक ईवेंट श्रोता की तरह, या कुछ ऐसा जो 'notification_object.object' और इसके पहचानकर्ता को वास्तविक वस्तु में परिवर्तित करता है? बहुत धन्यवाद @ आर्टजॉम, यह बहुत मददगार है :) – Mick

21

यह वास्तव में एक सार सवाल है, तो मुझे लगता है कि हम सिर्फ उनका कहना है कि आप या नहीं करना चाहिए करना चाहिए कि क्या करने के बजाय इस पर चर्चा करने के लिए जा रहे हैं।

यहाँ क्या मैं आपकी समस्याओं का के बारे में सोचना है:

  • हाँ, एक सूचना प्रणाली जटिल है, लेकिन हालांकि नरक के रूप में नहीं। आप इस तरह के सिस्टम मॉडलिंग और कार्यान्वयन पर कई अलग-अलग दृष्टिकोण प्राप्त कर सकते हैं, और वे एक माध्यम से उच्च स्तर की जटिलता तक हो सकते हैं;

  • Pesonally, मैं हमेशा सामान डेटाबेस चालित बनाने के लिए प्रयास करें। क्यूं कर? क्योंकि मैं जो भी हो रहा है उसका पूरा नियंत्रण रखने की गारंटी दे सकता हूं - लेकिन यह सिर्फ मुझे है, आप डेटाबेस संचालित दृष्टिकोण के बिना नियंत्रण कर सकते हैं; मेरा विश्वास करो, आप उस मामले पर नियंत्रण चाहते हैं;

  • मुझे आप के लिए एक असली मामला उदाहरण देना दें, ताकि आपको कहीं से शुरू कर सकते हैं। पिछले वर्ष में मैंने किसी प्रकार के सोशल नेटवर्क में एक अधिसूचना प्रणाली का मॉडल और कार्यान्वित किया है (बिल्कुल फेसबुक की तरह नहीं)। जिस तरह से मैंने अधिसूचनाओं को स्टोर किया था? मेरे पास notifications तालिका थी, जहां मैंने generator_user_id (अधिसूचना उत्पन्न करने वाले उपयोगकर्ता की आईडी), target_user_id (स्पष्ट प्रकार, है ना?), notification_type_id (जो अधिसूचना प्रकारों के साथ एक अलग तालिका के संदर्भ में है)), और उन सभी आवश्यक चीजें जिन्हें हमें अपनी टेबल भरने की आवश्यकता है (टाइमस्टैम्प, झंडे, आदि)। मेरी notification_types तालिका notification_templates तालिका के साथ संबंध रखने के लिए प्रयुक्त होती है, जो प्रत्येक प्रकार की अधिसूचना के लिए विशिष्ट टेम्पलेट संग्रहीत करती है। उदाहरण के लिए, मेरे पास POST_REPLY प्रकार था, जिसमें टेम्पलेट की तरह {USER} HAS REPLIED ONE OF YOUR #POSTS था। वहां से, मैंने एक संदर्भ लिंक के रूप में {} एक चर के रूप में और # का इलाज किया;

  • हाँ, प्रदर्शन और ठीक होना चाहिए चाहिए। जब आप अधिसूचनाओं के बारे में सोचते हैं तो आप सिर से पैर की अंगुली तक धक्का देने वाले सर्वर के बारे में सोचते हैं। या तो अगर आप AJAX अनुरोधों या जो कुछ भी कर रहे हैं, तो आपको प्रदर्शन के बारे में चिंता करने की आवश्यकता होगी। लेकिन मुझे लगता है कि यह दूसरी बार चिंता है;

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

+0

मुझे कुछ अन्य डेटा स्टोर के साथ नियंत्रण क्यों नहीं होगा? –

+0

ठीक है, मैंने यह नहीं कहा। मैंने जो कहा वह है कि मैं डेटाबेस-संचालित दृष्टिकोण के साथ डेटा नियंत्रण की गारंटी दे सकता हूं; लेकिन यह सिर्फ मुझे है। मैं इसे फिर से भरने वाला हूँ। अधिसूचना टेम्पलेट में –

+0

@DanielRibeiro प्लेसहोल्डर्स ({...}) को विभिन्न प्रकार की अधिसूचनाओं के लिए डेटाबेस में टेबल के विभिन्न सेट से प्लेसहोल्डर के डेटा को प्रतिस्थापित करने की आवश्यकता है। जैसे एक टेम्पलेट "{user} ने आपकी तस्वीर पसंद की है।", एक और टेम्पलेट "आपका {Pagename} नया जैसा है।" आदि {पृष्ठनाम} और {उपयोगकर्ता} और अन्य प्लेसहोल्डर्स विभिन्न डेटाबेस तालिका से मानचित्रित होंगे, इसलिए प्लेसहोल्डर्स को गतिशील रूप से प्राप्त करने के लिए स्कीमा क्या होना चाहिए। –

7
╔════════════════════╗ 
║notification  ║ 
╟────────────────────╢ 
║Username   ║ 
║Object    ║ 
║verb    ║ 
║actor    ║ 
║isRead    ║ 
╚════════════════════╝ 

यह 2 संग्रह होने के बजाय एक अच्छा जवाब दिखता है। आप उपयोगकर्ता नाम, ऑब्जेक्ट द्वारा क्वेरी कर सकते हैं और नई घटनाएं प्राप्त करने के लिए पढ़ सकते हैं (जैसे 3 लंबित मित्र अनुरोध, 4 प्रश्न पूछे गए आदि ...)

मुझे बताएं कि क्या इस स्कीमा में समस्या है।

+2

शीर्ष उत्तर सामान्यीकृत डेटा संरचना का उपयोग करता है, जिसका अर्थ है टेबल में कोई अनावश्यकता नहीं है। क्या आपका जवाब ऐसा करता है? –

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