2009-09-17 13 views
8

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

यह ठीक काम करता है, लेकिन gen_server मॉड्यूल में कोई स्थिति नहीं है। यह सब कुछ मैनेसिया टेबल में संग्रहीत है। तो, मुझे आश्चर्य है कि gen_server शायद उस तालिका को encapsulating के लिए सबसे अच्छा मॉडल नहीं है?

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

किसी भी इनपुट की बहुत सराहना की जाती है।

उत्तर

9

मुझे लगता है कि Occam's razor के अनुसार इस gen_server की कोई जरूरत अस्तित्व में नहीं है , वहाँ बिल्कुल कोई राज्य में संग्रहीत है, खासकर जब से। ऐसी प्रक्रियाओं में ऐसी प्रक्रिया की आवश्यकता हो सकती है जब आपको तालिका (या किसी अन्य संसाधन) तक पहुंच की आवश्यकता हो, सख्ती से अनुक्रमिक (उदाहरण के लिए आप किसी बाधा की लागत पर किसी भी निरस्त लेनदेन से बचना चाहते हैं)।

मॉड्यूल में तालिका में पहुंच को Encapsulating एक अच्छा समाधान है। यह कोई अतिरिक्त जटिलता बनाता है, जबकि उचित अवशोषण और encapsulation के स्तर प्रदान करते हैं।

6

मुझे यकीन नहीं है कि मैं समझता हूं कि आपने प्रक्रिया के साथ तालिका को समाहित करने का निर्णय क्यों लिया है। मैनेशिया को स्थानीय रूप से और क्लस्टर में वितरित दोनों टेबलों के लिए कई समवर्ती उपयोगों में मध्यस्थता के लिए डिज़ाइन किया गया है।

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

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

एकमात्र चीज जो gen_server आधारित एपीआई आपको एक शुद्ध-कार्यात्मक एपीआई पर देता है वह तालिका तक पहुंच को क्रमबद्ध करने के लिए है - जो एक असामान्य आवश्यकता है और जब तक आपको विशेष रूप से इसकी आवश्यकता नहीं होती है, यह एक प्रदर्शन हत्यारा होगा।

0

जब आप गंदे उपयोग का उपयोग करना चाहते हैं और लेनदेन से बचने के लिए एकल gen_server प्रक्रिया का उपयोग कर एक मेनेसिया टेबल को संभालना एक अच्छा विचार हो सकता है। यह दृष्टिकोण टीएक्स से तेज हो सकता है, लेकिन आमतौर पर आपको इसे बेंचमार्क करना होगा।