स्केलेबल अधिसूचना प्रणाली कैसे डिजाइन करें? [बन्द है]


32

मुझे एक अधिसूचना प्रणाली प्रबंधक लिखने की आवश्यकता है।

यहाँ मेरी आवश्यकताएं हैं:

मुझे विभिन्न प्लेटफार्मों पर एक अधिसूचना भेजने में सक्षम होने की आवश्यकता है, जो पूरी तरह से अलग हो सकती है (छूट के लिए, मुझे एसएमएस या ई-मेल भेजने में सक्षम होने की आवश्यकता है)।

कभी-कभी किसी दिए गए प्लेटफ़ॉर्म के लिए सभी प्राप्तकर्ताओं के लिए अधिसूचना समान हो सकती है, लेकिन कभी-कभी यह प्रति प्लेटफ़ॉर्म प्रति प्राप्तकर्ता (या कई) प्रति सूचना हो सकती है।

प्रत्येक अधिसूचना में प्लेटफ़ॉर्म विशिष्ट पेलोड हो सकता है (छूट के लिए एक एमएमएस में एक ध्वनि या एक छवि हो सकती है)।

सिस्टम को स्केलेबल होने की आवश्यकता है , मुझे एप्लिकेशन या सर्वर को क्रैश किए बिना बहुत बड़ी मात्रा में अधिसूचना भेजने में सक्षम होने की आवश्यकता है।

यह एक दो चरण की प्रक्रिया है, पहले एक ग्राहक एक संदेश लिख सकता है और भेजने के लिए एक मंच चुन सकता है, और अधिसूचना (ओं) को या तो वास्तविक समय के बाद संसाधित किया जाना चाहिए।

तब सिस्टम को प्लेटफॉर्म प्रदाता को अधिसूचना भेजने की आवश्यकता होती है।


अभी के लिए, मैं कुछ के साथ समाप्त होता हूं, लेकिन मुझे नहीं पता कि यह कितना स्केलेबल होगा या अगर यह एक अच्छा डिज़ाइन है।

हालांकि मैं निम्नलिखित वस्तुओं (एक छद्म भाषा में) के बावजूद:

एक सामान्य Notificationवस्तु:

class Notification {
    String                 $message;
    Payload                $payload;
    Collection<Recipient>  $recipients;
}

निम्नलिखित वस्तुओं के साथ समस्या यह है कि अगर मैं 1.000.000 प्राप्तकर्ता हूँ? भले ही Recipientऑब्जेक्ट बहुत छोटा हो, लेकिन यह बहुत अधिक मेमोरी लेगा।

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

प्रत्येक बनाई गई सूचना को एक DB या Redis जैसे लगातार भंडारण में संग्रहीत किया जा सकता है।

यह बाद में यह सुनिश्चित करने के लिए एक अच्छा होगा कि यह स्केलेबल है?

दूसरे चरण पर, मुझे इस अधिसूचना को संसाधित करने की आवश्यकता है।

लेकिन मैं सूचना को सही प्लेटफ़ॉर्म प्रदाता तक कैसे अलग कर सकता था?

क्या मुझे किसी वस्तु का उपयोग करना चाहिए जैसे कि MMSNotificationएक का विस्तार abstract Notification? या कुछ और Notification.setType('MMS')?

एक ही समय में बहुत सारी सूचना को संसाधित करने की अनुमति देने के लिए, मुझे लगता है कि RabbitMQ जैसी एक संदेश सेवा प्रणाली सही उपकरण हो सकती है। क्या यह?

यह मुझे बहुत सारी सूचनाओं को कतारबद्ध करने और कई कार्यकर्ताओं को अधिसूचना जारी करने और उन्हें संसाधित करने की अनुमति देगा। लेकिन क्या होगा यदि मुझे प्राप्तकर्ताओं को बैचने की आवश्यकता है जैसा कि ऊपर देखा गया है?

फिर मैं एक ऐसी NotificationProcessorवस्तु की कल्पना करता हूं जिसके लिए मैं NotificationHandlerप्रत्येक NotificationHandlerको जोड़ सकता हूं जो प्लेटफ़ॉर्म प्रदाता से कनेक्ट करने और अधिसूचना निष्पादित करने के लिए प्रभारी होगा।

मैं भी EventManagerप्लगेबल व्यवहार की अनुमति देने के लिए एक का उपयोग कर सकते हैं ।

कोई प्रतिक्रिया या विचार?

अपना समय देने के लिए धन्यवाद।

नोट: मैं PHP में काम करने के लिए उपयोग किया जाता हूं और यह संभवतः मेरी पसंद की भाषा है।


संपादित करें (मॉर्फुनरियल के उत्तर के अनुसार)

  • प्रति सेकंड कितने संदेश भेज रहे हैं (वर्तमान / प्रारंभिक स्तरों को परिभाषित करें, अधिकतम स्तर को परिभाषित करें जिसे सिस्टम को फिर से डिज़ाइन किए जाने से पहले संभालना चाहिए)
  • सिस्टम में कौन सी हार्डवेयर बाधाएँ हैं (मेमोरी, सीपीयू आदि)
  • हार्डवेयर स्केल (यानी, अधिक सर्वर, क्लाउड कंप्यूटिंग आदि को जोड़ना)

  • कौन सी भाषाएं / प्रणालियाँ सूचनाएँ उत्पन्न कर रही होंगी?

यह अपने दम पर है, मैं प्रोग्राम को सूचनात्मक रूप से बनाने के लिए प्रभारी हूं लेकिन एक UI से निर्मित है।

  • क्या जनरेटर संदेश के प्राप्तकर्ता को जानता है (?) या वे कुछ अन्य माध्यमों द्वारा प्रदान किए जाते हैं (यानी, कुछ सतर्क प्रकारों के लिए व्यावसायिक नियम कुछ प्राप्तकर्ताओं के पास जाते हैं)

किसी विशिष्ट प्राप्तकर्ता, प्राप्तकर्ताओं के समूह (उदाहरण के लिए टैग सिस्टम का उपयोग करके) या पूरे प्लेटफ़ॉर्म के लिए एक अधिसूचना बनाना संभव हो सकता है।

  • क्या सीसी / बीसीसी / रीड प्राप्तियां जोड़ने के लिए व्यावसायिक नियम हैं

हाँ। ध्यान दें कि यह वास्तव में प्लेटफ़ॉर्म विशिष्ट है और सभी प्लेटफार्मों पर रीड या सीसी उपलब्ध नहीं है।

  • क्या जनरेटर जानता है कि यह किस प्रकार का संदेश भेज रहा है (यानी, एसएमएस / ईमेल) या क्या यह प्राप्तकर्ता से आधारित है

यह प्राप्तकर्ता पर आधारित है, हालाँकि, प्राप्तकर्ता प्लेटफ़ॉर्म संबंधित है, और प्लेटफ़ॉर्म में डेटा को संभालने के लिए अलग-अलग तरीके हैं, यूआई छवियों, एक ध्वनि या कुछ और सेट करने की अनुमति देने के लिए प्लेटफ़ॉर्म विशिष्ट होने की संभावना है।

  • क्या जनरेटर को भेजे / प्राप्त / पढ़े जा रहे संदेशों की पुष्टि की आवश्यकता है (async बनाम सिंक्रोनस भेजने)

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

  • क्या संदेश स्रोतों / प्राप्तकर्ताओं का इतिहास संग्रहीत करने की आवश्यकता है (कब तक?)

हां, हम कुछ आंकड़े और रिपोर्ट बनाना चाहते हैं। * अधिसूचना अंक को परिभाषित करें


  • संदेश भेजने के लिए किन सेवाओं का उपयोग किया जा रहा है? निर्भर करता है, कुछ शास्त्रीय रेस्ट वेब्स सर्विस हैं, अन्य कुछ विदेशी प्रोटोकॉल हैं, यह वास्तव में प्रदाता तक है।

  • क्या प्रतिक्रिया / पुष्टि प्रदान की जाती है (सिंक / async)

निर्भर करता है, कुछ समकालिक हैं और एक त्रुटि के साथ उत्तर देते हैं जबकि कुछ अन्य को त्रुटियों की जांच के लिए बाद में खींचने की आवश्यकता होती है।

  • क्या नए अंत-बिंदुओं को जोड़ने की संभावना है [भले ही, क्या इसे सार करने की आवश्यकता है]

हां, वास्तव में, हमारा ऐप बढ़ रहा है और हम नए प्रदाता को जोड़ने में सक्षम होना चाहते हैं, लेकिन यह प्रति वर्ष 1 या 2 जैसी चीज का अनुपात है।


22
वाल्टर, gnat, gbjbaanb, रॉबर्ट हार्वे, वोरस्टेन मुलर आलसी लोग प्रतीत होते हैं; मुझे ऐसा कोई कारण नहीं दिख रहा है जिसके लिए यह तर्क निम्न में से किसी एक तर्क के कारण बंद कर दिया गया हो: "अस्पष्ट, अस्पष्ट, अपूर्ण, अति व्यापक या अलंकारिक"। एक डिजाइन प्रश्न एक साधारण प्रश्न नहीं हो सकता है क्योंकि इसमें बहुत अधिक चीजें शामिल हैं, हालांकि मैं इस वेबसाइट के स्तर पर इस तरह के जटिल निर्णय को वास्तविक पेशेवर के बारे में चर्चा करने की अनुमति देता हूं।
ट्रेंट

प्रश्न पूछें लेकिन सवाल न पूछें! :) हाँ, कभी-कभी मैं भी मॉड्स की मानसिकता को थपथपाने में नाकाम रहता हूँ।
मर्चिफ़

upvotes और विचार दिखाते हैं कि यह सवाल कितना प्रासंगिक है .... अगर केवल मध्यस्थों ने समझा होता !!!
NoobEditor 5

RabbitMQ का उपयोग करना इस समस्या के लिए सही तरीका है। मुझे अपने BIG कंपनी के एक साक्षात्कार में बहुत ही समान समस्या के बारे में पूछा गया था और मैं सर्वश्रेष्ठ दोष सहिष्णु प्रकाशक / ग्राहक पैटर्न से जूझ रहा था। अंत में मुझे सही उत्तर बताया गया। RabbitMQ। लगता है जैसे उन्होंने इसका उपयोग करके समस्या को हल किया था। उम्मीद है की वो मदद करदे!!!
अकद

जवाबों:


16

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

उदाहरण के लिए, स्केलेबिलिटी के संबंध में आपकी गैर-कार्यात्मक आवश्यकताएं काफी अस्पष्ट हैं। यदि आप अपने सिस्टम पर वास्तविक संख्या डालते हैं तो यह बहुत अधिक मानसिक भार से छुटकारा दिला सकता है। उदाहरण के लिए,

  • प्रति सेकंड कितने संदेश भेज रहे हैं (वर्तमान / प्रारंभिक स्तरों को परिभाषित करें, अधिकतम स्तर को परिभाषित करें जिसे सिस्टम को फिर से डिज़ाइन किए जाने से पहले संभालना चाहिए)
  • सिस्टम में कौन सी हार्डवेयर बाधाएँ हैं (मेमोरी, सीपीयू आदि)
  • हार्डवेयर स्केल (यानी, अधिक सर्वर, क्लाउड कंप्यूटिंग आदि को जोड़ना)

अब जब आपके पास यह है, तो आप यह सुनिश्चित करने के लिए कुछ परीक्षण स्थापित कर सकते हैं कि सिस्टम डिज़ाइन / आर्किटेक्चर आपकी गैर-कार्यात्मक आवश्यकताओं को पूरा करने में सक्षम है।

सूचनाएं / संदेश भेजने की व्यावसायिक / कार्यात्मक आवश्यकताओं के लिए, निम्नलिखित सुराग मदद कर सकते हैं (यदि आप अधिक जानकारी प्रदान करते हैं तो मैं इस उत्तर को जोड़ सकता हूं:

अधिसूचना स्रोतों को परिभाषित करें

  • कौन सी भाषाएं / सिस्टम नोटिफिकेशन जेनरेट करेंगे
  • क्या जनरेटर संदेश के प्राप्तकर्ता को जानता है (?) या वे कुछ अन्य माध्यमों द्वारा प्रदान किए जाते हैं (यानी, कुछ सतर्क प्रकारों के लिए व्यावसायिक नियम कुछ प्राप्तकर्ताओं के पास जाते हैं)
  • क्या सीसी / बीसीसी / रीड प्राप्तियां जोड़ने के लिए व्यावसायिक नियम हैं
  • क्या जनरेटर जानता है कि यह किस प्रकार का संदेश भेज रहा है (यानी, एसएमएस / ईमेल) या क्या यह प्राप्तकर्ता से आधारित है
  • क्या जनरेटर को भेजे / प्राप्त / पढ़े जा रहे संदेशों की पुष्टि की आवश्यकता है (async बनाम सिंक्रोनस भेजने)
  • क्या संदेश स्रोतों / प्राप्तकर्ताओं का इतिहास संग्रहीत करने की आवश्यकता है (कब तक?)

अधिसूचना अंत अंक परिभाषित करें

  • संदेश भेजने के लिए किन सेवाओं का उपयोग किया जा रहा है
  • क्या प्रतिक्रिया / पुष्टि प्रदान की जाती है (सिंक / async)
  • क्या नए अंत-बिंदुओं को जोड़ने की संभावना है [भले ही, क्या इसे सार करने की आवश्यकता है]

मैं एक ठोस वास्तुकला उदाहरण प्रदान करने में संकोच कर रहा हूं क्योंकि इसमें शामिल कारकों के आधार पर बहुत अधिक निर्भर करेगा; लेकिन अक्सर सरलतम संदेश प्रणालियों में एक मूल कतार शामिल होती है, या तो मेमोरी / एप्लिकेशन, नो-एसक्यूएल, डिस्क, या रिलेशनल डेटाबेस में। तब एक अलग प्रक्रिया (या कई अलग-अलग प्रक्रियाएं यदि वितरित की जाती हैं) उनके संदेश प्रकारों के लिए कतार को प्रदूषित कर सकती हैं [अर्थात एक क्रॉन नौकरी]; और आवश्यक के रूप में भेजना।

संदेशों को तुरंत भेजने की आवश्यकता होने पर कुछ पुश-आधारित तकनीकों (जैसे कि PostgreSQL NOTIFY / LISTEN) का उपयोग करके भी इसे बढ़ाया जा सकता है।

एक सरल कतार का लाभ यह है कि संदेश उत्पन्न करने वाले सिस्टम में बहुत कम काम करना है, और हार्डवेयर / प्रदर्शन आवश्यकताओं के आधार पर प्रसंस्करण प्रणाली को संतुलित किया जा सकता है।


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

-2

क्या आपने अपने नोटिफिकेशन ऑब्जेक्ट के लिए फ्लाईवेट डिज़ाइन पैटर्न पर विचार किया है? मैं इसके बारे में बहुत आश्वस्त नहीं हूं, क्योंकि मैंने कभी भी पैटर्न को लागू नहीं किया है, लेकिन मुझे याद है कि इसमें फ्लाईवेट ऑब्जेक्ट्स के बीच कुछ राज्य साझा करना शामिल है। मुझे यह भी लगता है, अगर अधिक अतिरेक वाले सदस्यों को साझा किया जाता तो बड़ा प्रभाव पड़ता। तो यह निर्भर करता है कि क्या आप बहुत सारे लोगों को केवल कुछ संदेश भेजते हैं या इसके विपरीत।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.