मुझे पता है कि यहां भी इसी तरह के सवाल हैं, लेकिन वे मुझे नियमित आरडीबीएमएस सिस्टम में वापस जाने के लिए कह रहे हैं, अगर मुझे लेनदेन की आवश्यकता है या परमाणु संचालन या दो-चरणीय प्रतिबद्ध का उपयोग करना है । दूसरा समाधान सबसे अच्छा विकल्प लगता है। तीसरा, मैं इसका पालन नहीं करना चाहता क्योंकि ऐसा लगता है कि कई चीजें गलत हो सकती हैं और मैं इसे हर सूरत में परख नहीं सकता। मुझे परमाणु परिचालनों को करने के लिए अपनी परियोजना को फिर से शुरू करने में मुश्किल समय आ रहा है। मुझे नहीं पता कि यह मेरे सीमित दृष्टिकोण से आता है (मैंने अब तक केवल SQL डेटाबेस के साथ काम किया है), या क्या यह वास्तव में नहीं किया जा सकता है।
हम अपनी कंपनी में MongoDB का परीक्षण करना चाहते हैं। हमने एक अपेक्षाकृत सरल प्रोजेक्ट चुना है - एक एसएमएस गेटवे। यह हमारे सॉफ़्टवेयर को सेलुलर नेटवर्क पर एसएमएस संदेश भेजने की अनुमति देता है और गेटवे गंदा काम करता है: वास्तव में प्रदाताओं के साथ विभिन्न संचार प्रोटोकॉल के माध्यम से संवाद करना। गेटवे संदेशों की बिलिंग को भी प्रबंधित करता है। सेवा के लिए आवेदन करने वाले प्रत्येक ग्राहक को कुछ क्रेडिट खरीदने होते हैं। जब संदेश भेजा जाता है और संतुलन अपर्याप्त होने पर अभिगमन को अस्वीकार कर देता है, तो सिस्टम स्वचालित रूप से उपयोगकर्ता के संतुलन को कम कर देता है। इसके अलावा, क्योंकि हम तीसरे पक्ष के एसएमएस प्रदाताओं के ग्राहक हैं, इसलिए हमारे पास उनके साथ हमारे अपने संतुलन भी हो सकते हैं। हमें उन पर भी नजर रखनी होगी।
मैंने यह सोचना शुरू कर दिया कि अगर मैं कुछ जटिलता (बाहरी बिलिंग, कतारबद्ध एसएमएस भेजने) में कटौती करता हूं तो मैं MongoDB के साथ आवश्यक डेटा कैसे संग्रहीत कर सकता हूं। SQL दुनिया से आते हुए, मैं उपयोगकर्ताओं के लिए एक अलग तालिका, एसएमएस संदेशों के लिए एक और एक, उपयोगकर्ताओं के शेष के बारे में लेनदेन के भंडारण के लिए एक बनाऊंगा। मान लीजिए कि मैं MongoDB में उन सभी के लिए अलग संग्रह बनाता हूं।
इस सरल प्रणाली में निम्नलिखित चरणों के साथ एक एसएमएस भेजने वाले कार्य की कल्पना करें:
जांचें कि क्या उपयोगकर्ता के पास पर्याप्त संतुलन है; यदि पर्याप्त क्रेडिट नहीं है तो इनकार कर दें
एसएमएस संग्रह में विवरण और लागत के साथ संदेश को भेजें और संग्रहीत करें (लाइव सिस्टम में संदेश में एक
status
विशेषता होगी और एक कार्य इसे डिलीवरी के लिए उठाएगा और एसएमएस की कीमत अपनी वर्तमान स्थिति के अनुसार निर्धारित करेगा)भेजे गए संदेश की लागत से उपयोगकर्ताओं का संतुलन कम करना
लेन-देन संग्रह में लेन-देन लॉग इन करें
अब इसमें क्या दिक्कत है? MongoDB परमाणु अद्यतन केवल एक दस्तावेज़ पर कर सकता है। पिछले प्रवाह में ऐसा हो सकता है कि डेटाबेस में किसी प्रकार की त्रुटि हो जाती है और संदेश संग्रहीत हो जाता है, लेकिन उपयोगकर्ता का संतुलन अपडेट नहीं होता है और / या लेन-देन लॉग नहीं होता है।
मैं दो विचारों के साथ आया:
उपयोगकर्ताओं के लिए एक एकल संग्रह बनाएं, और शेष राशि को उपयोगकर्ता के दस्तावेज़ में उप-दस्तावेज़ के रूप में एक क्षेत्र, उपयोगकर्ता से संबंधित लेनदेन और संदेशों के रूप में संग्रहीत करें। क्योंकि हम दस्तावेजों को परमाणु रूप से अपडेट कर सकते हैं, यह वास्तव में लेनदेन की समस्या को हल करता है। नुकसान: यदि उपयोगकर्ता कई एसएमएस संदेश भेजता है, तो दस्तावेज़ का आकार बड़ा हो सकता है और 4 एमबी दस्तावेज़ सीमा तक पहुंचा जा सकता है। शायद मैं ऐसे परिदृश्यों में इतिहास के दस्तावेज़ बना सकता हूं, लेकिन मुझे नहीं लगता कि यह एक अच्छा विचार होगा। इसके अलावा, मुझे नहीं पता कि अगर मैं एक ही बड़े दस्तावेज़ में अधिक से अधिक डेटा धक्का देता हूं तो सिस्टम कितना तेज होगा।
उपयोगकर्ताओं के लिए एक संग्रह बनाएं, और लेनदेन के लिए एक। दो प्रकार के लेन-देन हो सकते हैं: सकारात्मक शेष परिवर्तन के साथ ऋण खरीद और नकारात्मक शेष परिवर्तन के साथ भेजे गए संदेश । लेन-देन में एक उप-साक्षरता हो सकती है; उदाहरण के लिए भेजे गए संदेशों में एसएमएस का विवरण लेनदेन में एम्बेड किया जा सकता है। नुकसान: मैं वर्तमान उपयोगकर्ता शेष को संग्रहीत नहीं करता हूं इसलिए मुझे हर बार यह गणना करना होगा कि उपयोगकर्ता यह बताने के लिए संदेश भेजने की कोशिश करता है कि क्या संदेश के माध्यम से जा सकता है या नहीं। मुझे डर है कि यह गणना धीमी हो सकती है क्योंकि संग्रहीत लेनदेन की संख्या बढ़ती है।
मैं थोड़ा उलझन में हूं कि किस विधि को चुना जाए। क्या अन्य उपाय हैं? मैं इस तरह की समस्याओं के आसपास काम करने के बारे में ऑनलाइन कोई सर्वोत्तम अभ्यास नहीं खोज सका। मुझे लगता है कि कई प्रोग्रामर जो NoSQL दुनिया से परिचित होने की कोशिश कर रहे हैं, वे शुरुआत में इसी तरह की समस्याओं का सामना कर रहे हैं।