आप अपने मल्टी-टेनेंट सिस्टम में एक्स्टेंसिबिलिटी कैसे प्रबंधित करते हैं?


13

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

यहाँ या वहाँ एक अतिरिक्त क्षेत्र, शायद एक अतिरिक्त पृष्ठ या वर्कफ़्लो के बीच में कुछ अतिरिक्त तर्क - उस तरह की बात।

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

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

तो लोग इसे प्रबंधित करने के लिए क्या कर रहे हैं? Force.com विलुप्तता का स्वामी प्रतीत होता है; जाहिर है कि उन्होंने जमीन से एक ऐसा प्लेटफॉर्म बनाया है जो सुपर एक्सटेंसिबल हो। आप उनके वेब-आधारित UI के साथ लगभग कुछ भी जोड़ सकते हैं। FogBugz ने कुछ ऐसा किया जहां उन्होंने एक मजबूत प्लगइन मॉडल बनाया, जो यह सोचने के लिए आता है कि वास्तव में फोर्स से प्रेरित हो सकता है। मुझे पता है कि उन्होंने इस पर बहुत समय और पैसा खर्च किया है और अगर मैं गलत नहीं हूं तो वास्तव में भविष्य के उत्पाद विकास के लिए आंतरिक रूप से इसका उपयोग करना था।

मुझे जिस तरह की चीज़ का निर्माण करने के लिए लुभाया जा सकता है, ऐसा लगता है, लेकिन शायद ऐसा नहीं करना चाहिए। :)

क्या प्लगेबल आर्किटेक्चर में बड़े पैमाने पर निवेश करना एकमात्र रास्ता है? आप इन समस्याओं का प्रबंधन कैसे कर रहे हैं, और आप किस तरह के परिणाम देख रहे हैं?

संपादित करें: ऐसा लगता है कि जैसे फोगबुग ने काफी मजबूत मंच बनाकर और फिर अपनी स्क्रीन को एक साथ रखने के द्वारा समस्या को संभाला। इसे विस्तारित करने के लिए आप एक DLL युक्त कक्षाएं बनाते हैं जो ISearchScreenGridColumn जैसे इंटरफ़ेस को कार्यान्वित करती है, और यह एक मॉड्यूल बन जाता है। मुझे यकीन है कि यह निर्माण करना काफी महंगा था, यह देखते हुए कि उनके पास बहुत सारे देव हैं और उन्होंने महीनों तक इस पर काम किया, साथ ही उनका सतह क्षेत्र शायद मेरे आवेदन के आकार का 5% है।

अभी मैं गंभीरता से सोच रहा हूं कि क्या Force.com इसे संभालने का सही तरीका है। और मैं एक हार्ड कोर ASP.Net लड़का हूं, इसलिए अपने आप को खोजने के लिए यह एक अजीब स्थिति है।


3
मुझे लगता है कि यह SO प्रश्न है, जो इसे एक समान क्रॉस पोस्ट बनाता है। कि ऐसा मत करो, या तो के लिए तो सवाल यहाँ चले गए करने के लिए पूछना, या आप देख रहे हैं कि अलग-अलग जवाब के लिए, हमें बताओ बिल्कुल क्यों तो सवाल पर जवाब संतोषजनक नहीं हैं।
यानिस डे

आप सही हैं, प्रश्न प्रोग्रामर्स पर बेहतर है, लेकिन यह अभी भी लगता है जैसे आपको कुछ बहुत अच्छे जवाब मिले। मैंने SO प्रश्न का संदर्भ देने के लिए प्रश्न संपादित किया।
maple_shaft

जवाबों:


8

मुझे एक समान समस्या का सामना करना पड़ा, और मैं आपको बताऊंगा कि मैं इसे हल करने के बारे में कैसे गया।

  1. सबसे पहले, एक "कोर" पुस्तकालय, या इंजन है। यह मूल रूप से शो चलाता है, जितना कि आप पहले ही समझ गए हैं। यह हर प्रणाली के लिए सामान्य चीजों को संभालता है, रूपों को गतिशील, उपयोगकर्ता और खाता प्रबंधन, भूमिकाओं से लेकर, आप इसे नाम देते हैं, यह ऐसा करता है।

  2. सिस्टम का प्रत्येक भाग एक मॉड्यूल के भीतर समाहित है। एक मॉड्यूल में निर्भरता होती है (अन्य मॉड्यूल जो इस पर निर्भर करता है)। उदाहरण के लिए, "कोर" प्रणाली में सुरक्षा (उपयोगकर्ता, समूह, भूमिकाएं, पासवर्ड नीतियां), लोकेल, (अनुवाद, देश, संस्कृतियां), फ़ाइल रिपोजिटरी, ईमेल, आदि हैं। प्रत्येक मॉड्यूल xml फ़ाइल का उपयोग करके खुद को परिभाषित करता है। Xml फ़ाइल मूल रूप से स्कीमा, टेबल, गणना वर्ग, स्क्रीन परिभाषा इत्यादि निर्दिष्ट करती है। जब फ़ाइल की तारीख बदल गई है तो आवेदन शुरू होने पर ये पढ़े जाते हैं ।

  3. ग्राहक-विशिष्ट मॉड्यूल की अपनी xml फ़ाइलें और स्वयं DLL हैं। यह सिस्टम के बाकी हिस्सों के अनुसार और पारदर्शी रूप से सभी कार्य करता है। मौजूदा एमवीसी विचारों को कस्टम कोड के साथ बदलने के लिए नीचे, कस्टम कोड और कस्टम व्यू मॉडल के साथ।

  4. यदि कोई ग्राहक मौजूदा कार्यक्षमता का विस्तार करना चाहता है, तो xml / system एक ऐसी विधि प्रदान करता है जहाँ मैं एक मॉड्यूल को दूसरे से "प्राप्त" कर सकता हूँ। नए मॉड्यूल में सभी मौजूदा कार्यक्षमता है, लेकिन नए DLL में ग्राहक की विशिष्ट आवश्यकताओं के साथ और विस्तारित XML फ़ाइल के साथ जो संशोधन कर सकती है। कैविएट है, वे वास्तव में इस प्रणाली में मौजूदा क्षेत्रों को हटा नहीं सकते हैं, लेकिन हम इसे विस्तारित कर सकते हैं और पूरी तरह से नई वस्तुओं और कार्यक्षमता प्रदान कर सकते हैं।


+1: ऐसा लगता है कि एक या दो घंटे लग गए। :)
ब्रायन मैकके

1
@BrianMacKay, ठीक है, एक बार काम पूरा हो गया था (और यह एक नारा था), हमारे ग्राहक उस गति से बहुत प्रसन्न थे जिस पर हम कस्टमाइज़ेशन को बदल सकते थे। ध्यान दें कि MVC फ्रेमवर्क (विचार / पृष्ठ जितना चिंतित हैं) मल्टी-प्रोजेक्ट होने के लिए खुद को बहुत अच्छी तरह से उधार नहीं देते हैं। हमने एसवीएन की संपत्ति विशेषताओं और कोर रिपॉजिटरी से लाए गए मुख्य विचारों का उपयोग करके इसे प्राप्त किया, और इसे अनुकूलित करने के लिए सीएसएस / लेआउट का उपयोग किया। लेकिन साल, एक अच्छा कुछ घंटे: पी
मू-जूस

बस जिज्ञासु, आप कब से सोचते हैं कि वास्तुकला को लागू करने में कितना समय लगा और कितने देव शामिल थे?
ब्रायन मैकके

1
@BrianMacKay, यह 5 महीने किया गया था। एक यूआई डेवलपर सभी सीएसएस / HTML / आंशिक विचार, जावास्क्रिप्ट, आदि करने के लिए, और एक बैकएंड डेवलपर (खुद) को आराम करने के लिए।
मू-रस

4

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

मैं अलग तरह से सलाह देता हूं। मैं जटिल चीजों को सरल रखने की सलाह देता हूं।

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

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

मेरे पास सामग्री प्रबंधन SAAS की सदस्यता सेवा भी है। यह उपयोग टियर्स के द्वारा भी काम करता है और ग्राहक अपनी स्वयं की प्लगइन्स को जोड़ सकते हैं यदि वे चाहते हैं जबकि मेरे पास मेरी टीम सभी के लिए अधिक सुविधाएँ जोड़ें।

यह सिर्फ इतने लंबे समय के बाद दीवार में मेरे सिर को पीटने से मेरा अनुभव है, फिर कुछ सरल पर ठोकर खा रहा है।

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


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

जो निष्कर्ष मैं आ रहा हूं, वह यह है कि आपको एक ऐसा प्लेटफॉर्म लिखना होगा जो UI घटकों और गतिशील संरचना की अपनी धारणा का समर्थन करता है, और फिर उस प्लेटफॉर्म का उपयोग करके संपूर्ण एप्लिकेशन का निर्माण करता है। और इसलिए मैं सोचने लगा हूँ कि यह पूरी तरह से बलपूर्वक ही लिखना होगा।
ब्रायन मैकके

यदि आप उत्सुक हैं तो ब्रायन, FYI करें kitgui.com और hubsoft.com।
जेसन सेब्रिंग

2

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

यह उपयोगकर्ता के लिए अतिरिक्त डेटा संग्रहीत करने का एक सरल और अच्छा तरीका है। इन क्षेत्रों के नाम और प्रकारों के बारे में अतिरिक्त जानकारी संग्रहीत करने की आवश्यकता होगी।

जो ग्राहक के लिए कस्टम फ़ील्ड को कवर करता है। कस्टम व्यवहार के लिए, एक वेब सेवा एपीआई एक्सटेंशन के लिए अनुमति देगा।


1

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

2) हाँ, प्रतिरूपकता और अनुकूलन क्षमता कठिन है। रणनीति पैटर्न जैसी चीजें मदद कर सकती हैं (फ़ंक्शन पॉइंटर्स के लिए एक फैंसी नाम; जावा में यह आमतौर पर एक इंटरफ़ेस घोषित करके लागू किया जाता है, जिसे वर्ग के उपयोगकर्ता आपके कोड के व्यवहार को अनुकूलित करने के लिए लागू कर सकते हैं), लेकिन आप बहुत अलग और विघटित करना चाहते हैं यह काम करने के लिए कोड।

3) डेटा-वार, यह स्कीमालेस स्टोरेज के उपयोगी होने के उदाहरणों में से एक हो सकता है। यदि आपके पास एक संबंधपरक डेटा मॉडल है, तो विभिन्न ग्राहकों के लिए बहुत सारे स्तंभों वाली तालिकाएँ समस्याग्रस्त हैं (हाँ, आप बहुत सारे अशक्त स्तंभों के साथ समाप्त होते हैं, जो बुरा है ; एक कारण यह है कि सही बाधाओं को सेट करना कठिन या असंभव है] बाधाएं जो नल के अवैध संयोजनों को प्रकट करने की अनुमति नहीं देती हैं])। ग्राहक-विशिष्ट तालिकाओं को जोड़ना ( usersऔर foo_users, usersसभी ग्राहकों के लिए मान्य फ़ील्ड foo_usersरखने और फू विशिष्ट दायर होने के साथ) बेहतर है; आपके पास आसानी से सही बाधाएँ हो सकती हैं, लेकिन आपका RDBMS इसे इनायत से नहीं संभाल सकता है (विस्फोट में शामिल होने, तालिकाओं की संख्या की सीमा आदि) के कारण और संभवतः आपके कोड में बदसूरत दिखाई देगा।

आप अपने आरडीबीएमएस में एक कुंजी-मूल्य स्टोर को लागू कर सकते हैं, जो आपके डेटा मॉडल को कम से कम संबंधपरक-ईश बनाता है और असुविधा का कारण होगा (यानी रिलेशनल डेटाबेस रिलेशनल-ईश मॉडल के साथ सबसे अच्छा काम करता है)। मुझे यकीन नहीं है कि एक NoSQL समाधान समग्र रूप से समस्या को फिट करेगा, लेकिन अधिकांश कार्यान्वयन का योजनाबद्ध-नेस एक फायदा हो सकता है।

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