थोड़ी पृष्ठभूमि
मैं वर्षों से मल्टी-टेनेंसी ऐप चलाने के लिए अपार्टमेंट रत्न का उपयोग कर रहा हूं । अब हाल ही में डेटाबेस को अलग-अलग होस्ट में स्केल करने की आवश्यकता आ गई है, db सर्वर केवल अधिक नहीं रख सकता है (दोनों पढ़ता है और लिखता है बहुत अधिक हो रहा है) - और हाँ, मैंने हार्डवेयर को अधिकतम तक बढ़ाया (समर्पित) हार्डवेयर, 64 कोर, छापे 10, 384 जीबी रैम आदि में 12 एनवीएम-ई ड्राइव)।
मैं इसे प्रति-किरायेदार (1 किरायेदार = 1 डेटाबेस कनेक्शन कॉन्फिगरेशन / पूल) करने पर विचार कर रहा था, क्योंकि यह एक "सरल" और कुशल तरीका होगा, जो कि number-of-tenantsएप्लिकेशन कोड परिवर्तनों के भार को किए बिना -times को अधिक क्षमता तक पहुंचाएगा।
अब, मैं ५.२ atm की रेल चला रहा हूँ, जल्द ही ५.२ पर अपग्रेड हो रहा है। मैं देख सकता हूं कि रेल 6 प्रति मॉडल कनेक्शन परिभाषाओं के लिए समर्थन जोड़ता है, हालांकि यह वास्तव में मुझे क्या चाहिए, जैसा कि मेरे 20 किरायेदारों में से प्रत्येक के लिए पूरी तरह से प्रतिबिंबित डेटाबेस स्कीमा नहीं है। आमतौर पर मैं "डेटाबेस" प्रति अनुरोध (मिडलवेयर में) या प्रति बैकग्राउंड जॉब (साइडकीक मिडलवेयर) पर स्विच करता हूं, हालांकि यह वर्तमान में अपार्टमेंट मणि के रूप में तुच्छ और संभाला है, क्योंकि यह सिर्फ search_pathपोस्टग्रैक्स्ल में सेट होता है और वास्तव में वास्तविक कनेक्शन को नहीं बदलता है। प्रति-किरायेदार होस्टिंग रणनीति पर स्विच करते समय मुझे अनुरोध के अनुसार पूरे कनेक्शन को स्विच करना होगा।
प्रशन:
- मैं समझता हूं कि मैं
ActiveRecord::Base.establish_connection(config)प्रति अनुरोध / पृष्ठभूमि नौकरी कर सकता हूं - हालांकि, जैसा कि मैं भी समझता हूं, कि एक पूरी तरह से नया डेटाबेस कनेक्शन हैंडशेक को ट्रिगर किया जा सकता है और पटरियों में स्पॉन करने के लिए एक नया डीबी पूल - सही है? मुझे लगता है कि मेरे आवेदन के लिए हर एक अनुरोध पर उस तरह का ओवरहेड बनाने के लिए एक प्रदर्शन आत्महत्या होगी। - इसलिए मैं सोच रहा हूं कि क्या कोई भी पहले से कई (कुल 20) डेटाबेस कनेक्शन / पूल की स्थापना की तरह रेल के साथ विकल्प देख सकता है (जैसे आवेदन के बूट पर), और फिर प्रति अनुरोध उन पूल के बीच स्विच करें? ताकि वह db कनेक्शन पहले से बना रहे हैं और उपयोग करने के लिए तैयार हैं।
- क्या यह सब सिर्फ एक घटिया विचार है, और क्या मुझे इसके बजाय एक अलग दृष्टिकोण की तलाश करनी चाहिए? जैसे 1 ऐप इंस्टेंट = एक विशिष्ट किरायेदार के लिए एक विशिष्ट कनेक्शन। या कुछ और।
masterशाखा में आपके लिए आवश्यक सुविधा जोड़ी है । क्या रेलिंग रनिंग एगडे एक विकल्प या बैक-प्रेटिंग होगी जो आपके वर्तमान रेल संस्करण के लिए सुविधा होगी?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... endमतलब है कि पूल (पुनः) का उपयोग किया जाएगा, बजाय हर बार एक नया कनेक्शन बनाने के?