माइक्रोसोर्सेज और साझा पुस्तकालय


9

हम स्वतंत्र माइक्रोसर्विसेज (एक रैबिटमैक बस के माध्यम से जुड़े) पर आधारित एक प्रणाली डिजाइन कर रहे हैं। कोड (कम से कम पहले घटकों के लिए) पायथन (दोनों python2 और python3) में लिखा जाएगा। हमारे पास पहले से ही कुछ व्यापारिक तर्क को लागू करने वाला एक मोनोलिथ एप्लिकेशन है, जिसे हम माइक्रोसर्विस के रूप में रिफ्लेक्टर करना चाहते हैं, और विस्तारित करना चाहते हैं। एक सवाल जो मुझे चिंतित करता है:

विभिन्न माइक्रोसर्विसेज के बीच कोड साझा करने का सबसे अच्छा तरीका क्या है। हमारे पास सामान्य सहायक कार्य (डेटा प्रोसेसिंग, लॉगिंग, कॉन्फ़िगरेशन पार्सिंग, आदि) हैं, जिनका उपयोग कई माइक्रोसिस्टर्स द्वारा किया जाना चाहिए।

स्वयं माइक्रोसॉर्क्स को अलग-अलग परियोजनाओं (गिट रिपॉजिटरी) के रूप में विकसित किया जा रहा है। सामान्य पुस्तकालयों को स्व-निहित परियोजना के रूप में भी विकसित किया जा सकता है। मैं इन पुस्तकालयों को माइक्रोसर्विसेस के बीच कैसे साझा करूं?

मैं कई दृष्टिकोण देखता हूं:

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

मैं सुझाव दिया दृष्टिकोण, सर्वोत्तम प्रथाओं, पिछले अनुभवों के बारे में थोड़ा और पढ़ना चाहूंगा कि कैसे आगे बढ़ना है। क्या आपके पास कोई सुझाव या लिंक है?


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

@CaptainMan: ज़रूर, लेकिन मान लें कि आपके पास यह सरल कार्य है: fib(n)( फंक्शंस श्रृंखला का कार्यान्वयन)। आप प्रत्येक माइक्रोसेवा में उस कार्यान्वयन को दोहराना नहीं चाहते हैं। यह एक utilsलाइब्रेरी का है (संस्करण, सुविधाओं और बगफिक्स के लिए)। यह कोई वितरित मोनोलिथ नहीं है, यह केवल सामान्य कार्यक्षमता की एक परत है। मेरा सवाल यह है कि कार्यान्वयन स्तर पर इस परत को कैसे संभालना है?
ब्लूफैस्ट

हमारे माइक्रोसर्विसेज ने पुस्तकालयों को यह सुनिश्चित करने के लिए साझा किया है कि वे हमारे सिस्टम में अन्य सभी माइक्रोसॉर्क्स से उसी तरह बात करें। मुझे यकीन नहीं है कि गैर-साझा पुस्तकालयों के साथ ऐसा करना कैसे संभव होगा; नंगे न्यूनतम पर हर किसी को कुछ XML / JSON / etc हेरफेर की आवश्यकता होगी। मैंने अभी तक उस प्रस्तुति को नहीं देखा है, लेकिन क्या आपके पास "साझा पुस्तकालय" का एक और विशिष्ट अर्थ है जो मैं सोच रहा हूं?
Ixrec

1
@ jeckyll2hide हम C ++ का उपयोग कर रहे हैं, लेकिन इसके लिए हमारा बुनियादी ढांचा लगभग आपकी दूसरी बुलेट बिंदु के बराबर है: अलग रेपो, हर कोई अपनी निर्भरता की घोषणा करता है, मानक निर्माण प्रणाली जो जानता है कि बिल्ड समय पर उन निर्भरताओं को कैसे पता चलेगा, आदि
Ixrec

1
मैं एक डमी की तरह महसूस करता हूं, आप सवाल कर रहे हैं कि वास्तव में लाइब्रेरियों को पुस्तकालयों को साझा करने के बारे में विशेष रूप से नहीं है, यह वास्तव में टीम के साथ अपनी टीम के पुस्तकालयों को साझा करने के तरीके के बारे में पूछ रहा है। मुझे पता है कि उत्तर देने के लिए पर्याप्त है।
कप्तान मैन

जवाबों:


5

आपका दूसरा विकल्प निश्चित रूप से जाने का रास्ता है। आम पुस्तकालयों को तोड़ें और उन्हें अपने स्थानीय PyPi सर्वर पर स्थापित करें।

विकल्प 1 भयावह है क्योंकि पुस्तकालयों में सुधार उन लोगों के लिए प्रचार करना मुश्किल होगा जो इसका उपयोग कर सकते थे।

विकल्प 3 विकल्प 1 के समान है।

सामान्य पैटर्न जेनकिन्स को सेटअप करना है ताकि जब आप किसी लाइब्रेरी रेपो के मास्टर को धक्का दे, तो यह एक अजगर का निर्माण करता है और इसे स्वचालित रूप से PyPi रेपो पर अपलोड करता है। एक बार जब आप इस स्क्रिप्ट को लिखते हैं, तो आपको कभी भी पैकेजिंग पुस्तकालयों और उन्हें मैन्युअल रूप से PyPi पर अपलोड करने की चिंता नहीं करनी होगी। और इस विकल्प के साथ, सभी पुस्तकालय अपडेट संभवतः अन्य माइक्रोसर्विसेज में अपग्रेड होने के लिए तुरंत उपलब्ध होंगे।

अपना खुद का PyPi सर्वर सेट करना बहुत आसान है। मुझे यह गाइड पसंद है


1
मैं मानता हूँ कि विकल्प 2 सबसे अच्छा है, लेकिन विकल्प 3 में
सबमॉडल्स के

@ 8 बिट्टी: हाँ, विकल्प 3 विकल्प 2 के समान है, लेकिन गिट सर्वर ("केंद्रीय" रिमोट) पैकेज वितरण तंत्र होना चाहिए। एक ओर यह किसी चीज के लिए नहीं (निर्भरता प्रबंधन) के लिए git का उपयोग कर रहा है, दूसरी ओर यह घटकों की संख्या कम करता है (निजी PyPi की कोई आवश्यकता नहीं)
ब्लूफैस्ट

2

पायथन लड़का नहीं है, लेकिन PyPi सर्वर सबसे अच्छा विकल्प है। एक त्वरित googling उपस्थिति देता है कि यह टीम के जावा जार के लिए नेक्सस रेपो होने के अनुरूप है।

वास्तव में जब तक यह किसी प्रकार के केंद्रीय भंडार (कार्यालय / टीम के लिए) में तैनात किया जा रहा है, तब तक आपकी पसंद का निर्भरता प्रबंधन उपकरण काम कर सकता है (से पढ़ा और तैनात किया जा सकता है) तो यह एक अच्छा विकल्प है।

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

विकल्प 3 शायद ठीक काम करेगा, लेकिन इसका स्थानीय पेपी पर कोई वास्तविक लाभ नहीं है (अन्य के अलावा शायद इसे स्थापित करना आसान है, लेकिन एक वास्तविक निर्भरता प्रबंधन प्रणाली के लाभ सिर्फ इतने बेहतर हैं)।


1

सबसे पहले एक मोनोलिथ को माइक्रोसर्विस में विभाजित करना हमेशा कठिन होने वाला है। विकेंद्रीकृत डेटा प्रबंधन देखें - क्यों का एक विचार के लिए microservices में डेटाबेस encapsulating

उस ने कहा, यह अपेक्षाकृत कम करने के लिए कई व्यंजनों हैं। उनमें से एक http://12factor.net/ है । वह कहता है कि आपको प्रत्येक पुस्तकालय और आवेदन को स्वतंत्र रूप से बनाए रखना चाहिए, फिर निर्भरता को स्पष्ट रूप से प्रबंधित करें। यदि आप उस मार्ग पर जाते हैं तो मैं सिफारिश करने जा रहा हूं कि आपके पास एक सरल आदेश है जो सभी निर्भरता को अद्यतन करता है जो कुछ भी वर्तमान है, और आप इसे प्रत्येक माइक्रो-सेवा के लिए नियमित रूप से चलाते हैं। यह एक महत्वपूर्ण रिलीज प्रक्रिया होना जरूरी है जहां आप उत्पादन में पुस्तकालयों के संस्करणों को बंद कर देते हैं। हालांकि आप वास्तव में, वास्तव में , वास्तव में ऐसी स्थिति में नहीं रहना चाहते हैं जहां निर्भरता बासी हो जाए और आपको पता न चले कि वहां क्या है।

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


0

आपको लायब्रेरी वाले निजी GitHub रेपो में एक Python पैकेज निर्भरता फ़ाइल से सीधे इंगित करके सर्वर रहित होने में सक्षम होना चाहिए। पिपेनव और कवि दोनों इसका समर्थन करते हैं, मेरा मानना ​​है।

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