यह एक बहुत ही खुला प्रश्न है, लेकिन मैं यह बताने की कोशिश करूंगा कि वितरित सिस्टम को विकसित करने के लिए एलिक्सिर / एर्लैंग सबसे अच्छा प्लेटफॉर्म क्यों हो सकता है (भले ही आप माइक्रोसर्विस के साथ काम कर रहे हों)।
सबसे पहले, कुछ पृष्ठभूमि के साथ शुरू करते हैं। Erlang VM और उसके मानक पुस्तकालय को वितरित सिस्टम के निर्माण के लिए तैयार किया गया था और यह वास्तव में दिखाता है। जहां तक मुझे पता है, यह एकमात्र रनटाइम और वीएम है जो इस उपयोग के मामले के लिए अपफ्रंट डिज़ाइन किए गए उत्पादन में व्यापक रूप से उपयोग किया जाता है।
अनुप्रयोग
उदाहरण के लिए, आपने पहले ही "एप्लिकेशन" पर संकेत दिया है। Erlang / Elixir में, कोड को उन अनुप्रयोगों के अंदर पैक किया जाता है जो:
- यूनिट के रूप में शुरू और बंद किया जाता है। अपने सिस्टम को शुरू करना और रोकना सभी अनुप्रयोगों को शुरू करने का विषय है
- एक एकीकृत निर्देशिका संरचना और कॉन्फ़िगरेशन API प्रदान करें (जो XML नहीं है!)। यदि आपने पहले से ओटीपी एप्लिकेशन के साथ काम किया है और कॉन्फ़िगर किया है, तो आप जानते हैं कि किसी अन्य के साथ कैसे काम करना है
- सभी प्रक्रियाओं के साथ आपके आवेदन पर्यवेक्षण का पेड़ शामिल है (प्रक्रिया से मेरा मतलब है "वीएम प्रक्रियाएं" जो गणना के हल्के धागे हैं) और उनकी स्थिति
इस डिजाइन का प्रभाव बहुत बड़ा है। इसका मतलब यह है कि अमृत डेवलपर्स, जब अनुप्रयोगों को लिखना अधिक स्पष्ट दृष्टिकोण है:
- उनका कोड कैसे शुरू और बंद किया जाता है
- वे कौन सी प्रक्रियाएं हैं जो किसी एप्लिकेशन का हिस्सा बनती हैं और इसलिए एप्लिकेशन स्थिति क्या है
- क्रैश होने की स्थिति में या कुछ गलत होने पर वे प्रक्रिया कैसे प्रतिक्रिया देगी और प्रभावित होगी
इतना ही नहीं, इस अमूर्त के आसपास टूलींग महान है। यदि आपके पास अमृत स्थापित है, तो "iex" खोलें और टाइप करें :observer.start()
:। अपने लाइव सिस्टम के बारे में जानकारी और रेखांकन दिखाने के अलावा, आप यादृच्छिक प्रक्रियाओं को मार सकते हैं, उनकी स्मृति उपयोग, स्थिति और अधिक देख सकते हैं। फ़ीनिक्स एप्लिकेशन में इसे चलाने का एक उदाहरण इस प्रकार है:
यहाँ अंतर यह है कि अनुप्रयोग और प्रक्रियाएँ उत्पादन में आपके कोड के बारे में तर्क करने के लिए आपको एक अमूर्तता प्रदान करती हैं । कई भाषाओं में संकुल संगठन के लिए संकुल, वस्तुएं और मॉड्यूल उपलब्ध हैं, जो रनटाइम सिस्टम पर कोई प्रतिबिंब नहीं है। यदि आपके पास एक क्लास विशेषता या एक सिंगलटन ऑब्जेक्ट है: तो आप उन संस्थाओं के बारे में कैसे तर्क दे सकते हैं जो इसे हेरफेर कर सकते हैं? यदि आपके पास मेमोरी लीक या अड़चन है, तो आप इसके लिए जिम्मेदार इकाई कैसे पा सकते हैं?
यदि आप किसी को एक वितरित प्रणाली चलाने के लिए कहते हैं, तो यह उस तरह की अंतर्दृष्टि है जो वे चाहते हैं, और एर्लांग / अमृत के साथ आपके पास बिल्डिंग ब्लॉक के रूप में है।
संचार
यह सब वास्तव में अभी शुरुआत है। वितरित सिस्टम का निर्माण करते समय, आपको एक संचार प्रोटोकॉल और डेटा धारावाहिक चुनने की आवश्यकता होती है। बहुत सारे लोग HTTP और JSON का चयन करते हैं, जो जब आप इसके बारे में सोचते हैं, तो वास्तव में RPC कॉल करने के लिए एक बहुत ही क्रियात्मक और महंगा संयोजन है।
Erlang / Elixir के साथ, आपके पास पहले से ही संचार प्रोटोकॉल और बॉक्स से बाहर एक क्रमिक तंत्र है। यदि आप दो मशीनों को एक-दूसरे के साथ संचार करना चाहते हैं, तो आपको केवल उन्हें नाम देने की आवश्यकता है, सुनिश्चित करें कि उनके पास एक ही रहस्य है, और आप कर रहे हैं।
जेमी ने एर्लांग फैक्ट्री 2015 में इस बारे में बात की और गेम प्लेटफॉर्म बनाने के लिए वे इसका लाभ कैसे उठा पाए: https://www.youtube.com/watch?v=_i6n-eWiVn4
यदि आप HTTP और JSON का उपयोग करना चाहते हैं, तो यह भी ठीक है और फीनिक्स जैसे प्लग और फ्रेमवर्क जैसे पुस्तकालय आपको गारंटी देंगे कि आप यहां भी उत्पादक हैं।
Microservices
अब तक मैंने माइक्रोसर्ज के बारे में बात नहीं की है। ऐसा इसलिए, क्योंकि इस बिंदु तक, वे वास्तव में मायने नहीं रखते हैं। आप पहले से ही अपने सिस्टम और नोड्स को बहुत छोटी प्रक्रियाओं के आसपास डिजाइन कर रहे हैं जो अलग-थलग हैं। यदि आप चाहें, तो उन्हें नैनो सर्वर पर कॉल करें!
इतना ही नहीं, उन्हें अनुप्रयोगों में भी पैक किया जाता है, जो उन्हें उन इकाइयों के रूप में समूह बनाता है जिन्हें इकाई के रूप में शुरू और बंद किया जा सकता है। यदि आपके पास ए, बी और सी के आवेदन हैं, और फिर आप उन्हें [ए, बी] + [सी] या [ए] + [बी] + [सी] के रूप में तैनात करना चाहते हैं, तो आपको ऐसा करने में बहुत कम परेशानी होगी उनके अंतर्निहित डिजाइन के लिए। या, इससे भी बेहतर, यदि आप अपने सिस्टम अपफ्रंट में माइक्रोसर्विस की तैनाती की जटिलता को जोड़ने से बचना चाहते हैं, तो आप उन्हें पूरी तरह से एक ही नोड में तैनात कर सकते हैं।
और, दिन के अंत में, यदि आप एर्लांग डिस्ट्रीब्यूटेड प्रोटोकॉल का उपयोग करके यह सब चला रहे हैं, तो आप उन्हें अलग-अलग नोड्स में चला सकते हैं और जब तक आप उनके {:node@network, :name}
बजाय उन्हें संदर्भित करते हैं, तब तक वे अन्य तक पहुंच पाएंगे :name
।
मैं और आगे जा सकता था लेकिन मुझे आशा है कि मैंने आपको इस बिंदु पर आश्वस्त किया है। :)