मल्टी-टेनेंट माइक्रोसर्विस डिज़ाइन


13

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

निम्नलिखित डिजाइन जो हम विचार कर रहे हैं, वे इस प्रकार हैं:

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

विकल्प 2: देश के डेटाबेस के अनुसार 1 माइक्रोसेवेर्स इंस्टाल करें। उनके सामने एक एपीआई गेटवे के साथ आवागमन मार्ग

यदि आप इस प्रकार की प्रणाली डिजाइन करते हैं, तो आपकी पसंद क्या होगी?


3
मुझे लगता है कि यह आपके विशिष्ट कार्यात्मक और गैर-कार्यात्मक आवश्यकताओं पर निर्भर करता है।
रॉबर्ट हार्वे

विभिन्न डेटाबेस लेकिन एक ही उदाहरण इसे पढ़ रहा है? क्या नियामक आवश्यकता का भी उल्लंघन नहीं होता है?
जिमी टी।

विकल्प 1 भी Microservices वास्तुकला शैली के साथ गठबंधन नहीं लगता है।
लवी

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

जवाबों:


4

मुझे लगता है कि विकल्प 2 एक बुरा नहीं है, लेकिन इसकी आवश्यकता नहीं हो सकती है। सूक्ष्म सेवाएँ आपको कई अनुप्रयोगों की आवश्यकताओं से निपटने के लिए हैं।

यहां एक बड़ा कारक यह है कि क्या दोनों स्कीमाओं के बीच कोई अंतर है, और अगर भविष्य में कभी भी ऐसा होगा।

आमतौर पर, मुझे लगता है कि रिपॉजिटरी के लिए इंटरफेस का उपयोग करना अनावश्यक है; हालाँकि, यह इस उदाहरण में प्रयास के लायक हो सकता है। रिपोजिटरी कारखाने आपके लिए महत्वपूर्ण होंगे।

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

हालांकि स्कीमा आपके दो अलग-अलग डेटाबेसों के लिए भिन्न नहीं होती है, आप एक रिपॉजिटरी को आसानी से दोनों के साथ सौदा कर सकते हैं, आवेदन के बिना अंतर जानने के बिना:

public class MyEntityRepository : ISavesMyEntity, IGetsMyEntity
{
    public MyEntityRepository(string connectionString)
    {
       _connectionString = connectionString;
    }
}

public class MyEntitySaverFactory
{
    public ISavesMyEntity GetSaver(User user)
    {
        if (user.IsUK)
            return new MyEntityRepository(Config.Get("UKConnString"));
        if (user.IsUS)
            return new MyEntityRepository(Config.Get("USConnString"));
        throw new NotImplementedException();
    }
}

//USE
ISavesMyEntity saver = factory.GetSaver(currentUser);
saver.Save(myEntityInstance);

यदि DB स्कीमा कभी यूएस और यूके के बीच असमान हो जाती है, तो आप फिर कार्यक्षमता को दो पूरी तरह से अलग-अलग रिपॉजिटरी में विभाजित करेंगे। यह आसान होगा, क्योंकि आपको अपने कारखाने को बदलना होगा।


1
मुझे नहीं मिलता कि आपको इस कारखाने की आवश्यकता क्यों है। स्टार्टअप पर कॉन्फ़िगरेशन विवरणों के पथ में बस पास क्यों नहीं? इसके साथ आपको हर बार एक नया क्षेत्र / देश जोड़ना चाहते हैं।
जिम्मीजम्स

1
यहाँ मुद्दा अलग देशों में उपयोगकर्ताओं के साथ काम नहीं कर रहा है ... यह विभिन्न डेटाबेसों के साथ काम कर रहा है। क्या होगा अगर अलग-अलग स्कीमा हैं? खपत वर्ग को यह पता लगाने के लिए जिम्मेदार होना चाहिए कि DB कनेक्शन स्ट्रिंग कहां से प्राप्त करें?
TheCatWhisperer

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

यह दो डेटाबेस से बात करने वाला एक एप्लिकेशन है।
TheCatWhisperer

मुझे लगता है कि आप समस्या को गलत समझते हैं: "हमें क्लाइंट के डेटा को अलग-अलग देशों (देश विशिष्ट) डेटाबेसों में रखना होगा" दो डेटाबेसों से बात करने के लिए एक एकल "उदाहरण" के लिए कोई आवश्यकता नहीं है। मुझे संदेह है कि यह सिर्फ दो DB है। ओपी का मतलब शायद "उदा" था जब उन्होंने टाइप किया था "यानी"
जिम्मीजम्स

0

मैं दूसरे विकल्प के साथ जाऊंगा, यह विकास और तैनाती में कम घर्षण देता है।

यह बेहतर मापनीयता और उपलब्धता और बेहतर शून्य डाउनटाइम परिनियोजन विकल्पों के लिए अनुमति देगा, क्योंकि आपने अपने एप्लिकेशन को प्रति क्षेत्र में 1 (या कम से कम एक) उदाहरण के लिए वितरित किया था, जो कि पूरी दुनिया के लिए कम से कम एक के विपरीत था।

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

सही बात?

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