प्रश्न का त्वरित संस्करण:
मैं एक बहु-किरायेदार वातावरण में सही डेटाबेस को लक्षित करने के लिए एक .Net कोर विंडोज़ सेवा को कैसे कॉन्फ़िगर कर सकता हूँ जहाँ प्रत्येक किरायेदार का अपना डेटाबेस होता है और वे सभी एक ही स्व-होस्टेड सर्वर पर चलते हैं?
कुछ पृष्ठभूमि की जानकारी:
मैं एक नई विंडोज़ सेवा पर काम कर रहा हूं और चूंकि यह पूरी तरह से नई है, इसलिए हम नेट कोर का उपयोग करने जा रहे हैं। मैंने यह पेज पढ़ा है और यह आईआईएस ऐप में पर्यावरण चर सेट करने के तरीके के बारे में बात करता है, नीला, विश्व स्तर पर, प्रति कमांड विंडो लेकिन यह वास्तव में एक विंडोज़ सेवा, नीला देवोप्स या बहु-किरायेदार वातावरण को कैसे संभालना है, इसका उल्लेख नहीं करता है।
सबसे अच्छा मैं यह समझ सकता हूं कि एक बार इसे बनाने के बाद आपको विंडोज़ सेवा के लिए प्रारंभ पैरामीटर में पर्यावरण चर सेट करना होगा लेकिन यह बहुत नाजुक लगता है। यह एक समस्या तब और बढ़ जाती है जब आप 25 को 100 या उससे अधिक की क्षमता के साथ देख रहे होते हैं (हम एक छोटी बढ़ती कंपनी हैं)। यदि हम सेवाओं को किसी अन्य सर्वर पर माइग्रेट करने का निर्णय लेते हैं तो वापस जाने और इन सभी चरों को मैन्युअल रूप से सेट करने का विचार सुखद नहीं है।
तो प्रश्न का लंबा संस्करण यह है: क्या मैं सही रास्ते पर हूं या क्या इसे स्थापित करने का कोई बेहतर तरीका है ताकि यह ऐसी मैन्युअल प्रक्रिया न बन जाए? सर्वर पर सेवा तैनात होने पर शायद एक चर सेट करना चाल चल जाएगा? हालांकि मैं एज़ूर देवोप्स के साथ ऐसा कैसे करूं?
संपादित करें 1
यहां उस परिवेश का प्रतिनिधित्व है जिसमें हम इन सेवाओं को चला रहे हैं।
Databases (separate machine):
Shared1
Db1
Db2
Db3
Machines:
Server1
Windows Services:
Service1
Service2
Service3
डेटाबेस डीबी सर्वर पर चल रहे हैं। प्रति सेवा एक डेटाबेस है और एक साझा डेटाबेस है जो कुछ सामान्य जानकारी संग्रहीत करता है (ऐसा नहीं लगता कि यह प्रश्न के लिए प्रासंगिक है)। एक सर्वर है। उस एक सर्वर पर कोड की प्रतियां होती हैं जिन्हें विंडोज़ सेवा के रूप में चलाने की आवश्यकता होती है। सेवा की प्रतियों की संख्या डेटाबेस की संख्या से मेल खाती है। तो उपरोक्त परिदृश्य के लिए: Serivce1
Db1
से जुड़ता है, Service2
Db2
से जुड़ता है, Service3
Db3
से जुड़ता है, आदि...
चूंकि मेरे पास केवल एक मशीन है, अगर मैं एक पर्यावरण चर को ASPNETCORE_DB1
जैसी किसी चीज़ पर सेट करता हूं तो तीनों सेवाएं उस चर को पढ़ेंगी और Db1
से कनेक्ट होंगी, जो कि होने की आवश्यकता नहीं है।
अगर मैं कई पर्यावरण चर सेट करता हूं: ASPNETCORE_Db1
, ASPNETCORE_Db2
, ASPNETCORE_Db2
, प्रत्येक सेवा को कैसे पता चलेगा कि किस पर्यावरण चर को पढ़ना है?
2 जवाब
मुझे ऐसा लग रहा है कि आप यहां कुछ चीजें मिला रहे हैं।
- यदि आप प्रति परिवेश अलग-अलग सेटिंग्स रखना चाहते हैं, तो आपको बस
CreateHostBuilder
विधि का उपयोग करने की आवश्यकता है। आप इसके बारे में पढ़ सकते हैं यहाँ. फिर आपको मशीन पर सेटASPNETCORE_ENVIRONMENT
पर्यावरण चर सेट करना होगा जहां आप ऐप होस्ट करते हैं। इस दृष्टिकोण में रनटाइम पर एप्लिकेशन उचित कॉन्फ़िगरेशन का चयन करता है। हालांकि, कृपया अपनी कॉन्फिग फाइलों में संवेदनशील डेटा न रखें। इस दृष्टिकोण में आपके पास सभी किरायेदारों के लिए एक संकलित कोड है। - जब आप कोई ऐप बनाते हैं तो आप कॉन्फ़िगरेशन पास कर सकते हैं। ऐसा करने के लिए आपको चर समूहों (Azure DevOps पर) (प्रति टेनैट पर एक) को परिभाषित करना चाहिए और अपने रहस्यों को कॉन्फ़िगरेशन फ़ाइल में फ़्लश करना चाहिए। इसके अलावा आप रनटाइम का उपयोग कर सकते हैं लक्ष्य टैनेंट को परिभाषित करने के लिए पैरामीटर। अभी भी पर्याप्त सुरक्षित नहीं है क्योंकि आर्टिफैक्ट (संकलित कोड) में आप रहस्य पा सकते हैं। इस दृष्टिकोण में आपके पास प्रति किरायेदार एक संकलित कोड है।
- यदि आप Azure KeyVault का उपयोग कर सकते हैं तो मैं इस दृष्टिकोण की अनुशंसा करता हूं। आप प्रति किरायेदार एक KeyVault बना सकते हैं और फिर
CreateHostBuilder
में उचित KeyVault से रहस्यों को लोड कर सकते हैं (यदि आप KeyVault को टैनेंट नाम के साथ नाम देते हैं, तो यह उचित KeyVault का चयन करना आसान बना देगा)। आप इसके बारे में यहां पढ़ सकते हैं।.
आपके प्रश्न के अनुसार मैंने मान लिया था कि आपका तेनात = envrionemnt. यदि नहीं, तो आपके पास Dev, QA और PROD जैसे प्रति env एक KeyVault हो सकता है। फिर आपको निम्नलिखित पैटर्न के साथ अपने रहस्यों को नाम देना चाहिए {tenant_name}_{secret_name}. आपको सभी सीक्रेट्स एटारिंग ऐप को लोड करना चाहिए और फिर रनटाइम पर (टेनेंट आईडी के आधार पर) उचित सीक्रेट का चयन करना चाहिए।
मुझे आशा है कि यह आपको अच्छा निर्णय लेने में मदद करेगा।
प्रति पर्यावरण चर के अनुरूप डेटाबेस कनेक्शनस्ट्रिंग प्राप्त करना बेहतर तरीका है। सरल कदम:
- मैन्युअल रूप से प्रत्येक वातावरण/मशीन में अलग-अलग मान (कनेक्शनस्ट्रिंग) के साथ एक ही पर्यावरण चर को परिभाषित करें
- अपने विंडोज़ सेवा ऐप में उस पर्यावरण परिवर्तनीय मान को प्राप्त करें और उस मान को डेटाबेस कनेक्शनस्ट्रिंग के रूप में उपयोग करें यदि शून्य नहीं है, अन्यथा डिफ़ॉल्ट कनेक्शनस्ट्रिंग का उपयोग करें।
संपादित करें: एक ही मशीन पर कई विंडोज़ सेवाओं के लिए, मेरा सुझाव है कि आप वर्तमान सेवा नाम के अनुसार कनेक्शनस्ट्रिंग निर्दिष्ट कर सकते हैं।
एक Windows सेवा अपना ServiceName कैसे निर्धारित कर सकती है?
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।