प्रश्न का त्वरित संस्करण:

मैं एक बहु-किरायेदार वातावरण में सही डेटाबेस को लक्षित करने के लिए एक .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, प्रत्येक सेवा को कैसे पता चलेगा कि किस पर्यावरण चर को पढ़ना है?

0
Thomas927 2 अप्रैल 2020, 22:14
कई दिनों तक आपका जवाब नहीं मिला, क्या स्टारियन का जवाब मददगार था? अगर आपको कोई चिंता है, तो बेझिझक उसे यहां साझा करें।
 – 
Hugh Lin
20 अप्रैल 2020, 05:15
लिन - MSFT जो मैंने समझा, उससे नहीं। मैंने इसे इस तरह पढ़ा: सर्वर 1: EnvVar_Db1, EnvVar_Db2, EnvVar_Db2। तो सेवा के प्रत्येक उदाहरण को कैसे पता चलता है कि किस पर्यावरण चर को देखना है? इस काम को देखने का एकमात्र तरीका यह है कि प्रत्येक किरायेदार के साथ अपने स्वयं के निर्माण की आवश्यकता के साथ एक बिल्ड वैल्यू को परिभाषित किया जाए। मैं वास्तव में उस परिदृश्य से बचना चाहूंगा। इसके अलावा ऐसा लगता है कि नेट कोर को एक बार निर्माण के साथ विकसित किया गया था, कई लोगों को दिमाग में तैनात किया गया था लेकिन ऐसा लगता है कि यह बहु-किरायेदार वातावरण में टूट गया है।
 – 
Thomas927
21 अप्रैल 2020, 00:16

2 जवाब

मुझे ऐसा लग रहा है कि आप यहां कुछ चीजें मिला रहे हैं।

  1. यदि आप प्रति परिवेश अलग-अलग सेटिंग्स रखना चाहते हैं, तो आपको बस CreateHostBuilder विधि का उपयोग करने की आवश्यकता है। आप इसके बारे में पढ़ सकते हैं यहाँ. फिर आपको मशीन पर सेट ASPNETCORE_ENVIRONMENT पर्यावरण चर सेट करना होगा जहां आप ऐप होस्ट करते हैं। इस दृष्टिकोण में रनटाइम पर एप्लिकेशन उचित कॉन्फ़िगरेशन का चयन करता है। हालांकि, कृपया अपनी कॉन्फिग फाइलों में संवेदनशील डेटा न रखें। इस दृष्टिकोण में आपके पास सभी किरायेदारों के लिए एक संकलित कोड है।
  2. जब आप कोई ऐप बनाते हैं तो आप कॉन्फ़िगरेशन पास कर सकते हैं। ऐसा करने के लिए आपको चर समूहों (Azure DevOps पर) (प्रति टेनैट पर एक) को परिभाषित करना चाहिए और अपने रहस्यों को कॉन्फ़िगरेशन फ़ाइल में फ़्लश करना चाहिए। इसके अलावा आप रनटाइम का उपयोग कर सकते हैं लक्ष्य टैनेंट को परिभाषित करने के लिए पैरामीटर। अभी भी पर्याप्त सुरक्षित नहीं है क्योंकि आर्टिफैक्ट (संकलित कोड) में आप रहस्य पा सकते हैं। इस दृष्टिकोण में आपके पास प्रति किरायेदार एक संकलित कोड है।
  3. यदि आप Azure KeyVault का उपयोग कर सकते हैं तो मैं इस दृष्टिकोण की अनुशंसा करता हूं। आप प्रति किरायेदार एक KeyVault बना सकते हैं और फिर CreateHostBuilder में उचित KeyVault से रहस्यों को लोड कर सकते हैं (यदि आप KeyVault को टैनेंट नाम के साथ नाम देते हैं, तो यह उचित KeyVault का चयन करना आसान बना देगा)। आप इसके बारे में यहां पढ़ सकते हैं।.

आपके प्रश्न के अनुसार मैंने मान लिया था कि आपका तेनात = envrionemnt. यदि नहीं, तो आपके पास Dev, QA और PROD जैसे प्रति env एक KeyVault हो सकता है। फिर आपको निम्नलिखित पैटर्न के साथ अपने रहस्यों को नाम देना चाहिए {tenant_name}_{secret_name}. आपको सभी सीक्रेट्स एटारिंग ऐप को लोड करना चाहिए और फिर रनटाइम पर (टेनेंट आईडी के आधार पर) उचित सीक्रेट का चयन करना चाहिए।

मुझे आशा है कि यह आपको अच्छा निर्णय लेने में मदद करेगा।

1
Krzysztof Madej 3 अप्रैल 2020, 01:25
# 1 के लिए ऐसा नहीं लगता है कि मैं एक ही सर्वर पर एकाधिक सेवाएं प्राप्त करने में सक्षम हूं क्योंकि आप सर्वर स्तर पर पर्यावरण चर सेट करने के बारे में बात करते हैं। यह मेरे लिए काम नहीं करेगा क्योंकि एक सर्वर इस एप्लिकेशन की प्रतियां होस्ट करने जा रहा है जहां प्रत्येक किरायेदार की एक प्रति है। मैं #2 से बचने की कोशिश कर रहा हूं क्योंकि मुझे प्रति किरायेदार निर्माण नहीं चाहिए। मुझे यकीन नहीं है कि #3 # 1 के शीर्ष पर इसके निर्माण के साथ कैसे काम करेगा। यदि #1 काम नहीं करने वाला है तो यह मेरे पास एक निर्माण करने के विकल्प नहीं छोड़ेगा?
 – 
Thomas927
3 अप्रैल 2020, 20:05

प्रति पर्यावरण चर के अनुरूप डेटाबेस कनेक्शनस्ट्रिंग प्राप्त करना बेहतर तरीका है। सरल कदम:

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

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

एक Windows सेवा अपना ServiceName कैसे निर्धारित कर सकती है?

0
starian chen-MSFT 23 अप्रैल 2020, 05:26
मान लीजिए कि मैं यहां भी जवाब दूंगा: प्रत्येक सेवा को कैसे पता चलेगा कि किस पर्यावरण चर को किसी प्रकार के विशेष निर्माण ध्वज के बिना प्राप्त करना है? प्रलेखन इस बारे में बात करता है कि आप यह निर्धारित करने के लिए पर्यावरण चर कैसे सेट कर सकते हैं कि कॉन्फ़िगरेशन के लिए कौन सी ऐपसेटिंग फ़ाइल का उपयोग करना है, लेकिन एक ही मशीन पर एक ही सेवा के कई उदाहरण होने और विभिन्न डीबी को इंगित करने की आवश्यकता होने पर क्या करना है, इसके बारे में कुछ भी उल्लेख नहीं करता है। .नेट कोर एक बार निर्मित होता है, कई को तैनात करता है लेकिन मैं यह नहीं समझ सकता कि इस विचार (जो मुझे पसंद है) को हमारे विशिष्ट मामले में कैसे लागू किया जाए।
 – 
Thomas927
21 अप्रैल 2020, 00:26
आप प्रत्येक मशीन में एक ही पर्यावरण चर का उपयोग कर सकते हैं और सेटिंग फ़ाइल डिफ़ॉल्ट मान के साथ समान होती है।
 – 
starian chen-MSFT
21 अप्रैल 2020, 11:14
मेरे पास इस मामले में केवल एक मशीन है इसलिए सभी सेवाएं समान पर्यावरण चर पढ़ रही हैं। हमारे पास मौजूद पर्यावरण सेटअप को बेहतर ढंग से समझाने के लिए मैं अपने प्रश्न को संपादित करूंगा।
 – 
Thomas927
21 अप्रैल 2020, 17:10
इस परिदृश्य के लिए, मुझे डर है कि आप पर्यावरण चर का उपयोग नहीं कर सकते हैं, मेरा सुझाव है कि आप वर्तमान सेवा नाम के अनुसार अलग-अलग कनेक्शनस्ट्रिंग का उपयोग कर सकते हैं। सेवा नाम प्राप्त करने के बारे में सूत्र है: Windows सेवा अपने ServiceName को कैसे निर्धारित कर सकती है ?
 – 
starian chen-MSFT
23 अप्रैल 2020, 05:25