मुझे एक अधिसूचना प्रणाली प्रबंधक लिखने की आवश्यकता है।
यहाँ मेरी आवश्यकताएं हैं:
मुझे विभिन्न प्लेटफार्मों पर एक अधिसूचना भेजने में सक्षम होने की आवश्यकता है, जो पूरी तरह से अलग हो सकती है (छूट के लिए, मुझे एसएमएस या ई-मेल भेजने में सक्षम होने की आवश्यकता है)।
कभी-कभी किसी दिए गए प्लेटफ़ॉर्म के लिए सभी प्राप्तकर्ताओं के लिए अधिसूचना समान हो सकती है, लेकिन कभी-कभी यह प्रति प्लेटफ़ॉर्म प्रति प्राप्तकर्ता (या कई) प्रति सूचना हो सकती है।
प्रत्येक अधिसूचना में प्लेटफ़ॉर्म विशिष्ट पेलोड हो सकता है (छूट के लिए एक एमएमएस में एक ध्वनि या एक छवि हो सकती है)।
सिस्टम को स्केलेबल होने की आवश्यकता है , मुझे एप्लिकेशन या सर्वर को क्रैश किए बिना बहुत बड़ी मात्रा में अधिसूचना भेजने में सक्षम होने की आवश्यकता है।
यह एक दो चरण की प्रक्रिया है, पहले एक ग्राहक एक संदेश लिख सकता है और भेजने के लिए एक मंच चुन सकता है, और अधिसूचना (ओं) को या तो वास्तविक समय के बाद संसाधित किया जाना चाहिए।
तब सिस्टम को प्लेटफॉर्म प्रदाता को अधिसूचना भेजने की आवश्यकता होती है।
अभी के लिए, मैं कुछ के साथ समाप्त होता हूं, लेकिन मुझे नहीं पता कि यह कितना स्केलेबल होगा या अगर यह एक अच्छा डिज़ाइन है।
हालांकि मैं निम्नलिखित वस्तुओं (एक छद्म भाषा में) के बावजूद:
एक सामान्य 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 जैसी चीज का अनुपात है।