2017-04-30 11 views
9

दो पुस्तकों, प्रोग्रामिंग Erlang (जो आर्मस्ट्रांग) और प्रोग्रामिंग अमृत (डेव थॉमस) पढ़ने के बाद, मैं असली दुनिया में Erlang/अमृत के बारे में कुछ सवाल है।कैसे करता है असली दुनिया में Erlang/अमृत काम

Q1: एकीकृत बैकएंड विकास

मैं एक तकनीक बात में एक टेबल देखा (मैं एक स्क्रीनशॉट बनाया है, लेकिन मैं स्रोत भूल गया यदि आप जानते हैं, एक टिप्पणी छोड़ कृपया।):

+ ---------------------- + ------------------------- + --------- + 
| Technical requirement | Server A     | Server B | 
+ ---------------------- + ------------------------- + --------- + 
| HTTP Server   | Nginx & Phusion   | Elixir | 
| Request Processing  | Ruby on Rails    | Elixir | 
| Long Running Requests | Go      | Elixir | 
| Server-Side State  | Redis      | Elixir | 
| Persistable Data  | Redis & Mongo    | Elixir | 
| Background Jobs  | Cron, Bash Scripts & Ruby | Elixir | 
| Service Crash Recovery | Upstart     | Elixir | 
+ ---------------------- + ------------------------- + --------- + 

क्या यह सच है? क्या एरलांग/एलिक्सीर इतना परिपक्व है कि यह सभी बैकएंड कार्यों को संभाल सकता है?

यदि सही है, तो क्या यह एरलांग/एलिक्सीर कोड आधार मोनोलिथिक होगा?

Q2: नरम वास्तविक समय

डिजाइनिंग से Erlang/OTP (फ्रांसेस्को Cesarini & स्टीव Vinoski) के साथ अनुमापकता के लिए:

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

क्या एरलांग/एलिक्सीर वास्तव में ऐसा कर सकता है?

यदि मेरा एरलांग सर्वर (केवल मशीन पर) केवल 1 एम संदेशों/सेकंड को संभाल सकता है और अनुरोध स्पाइक 5 एम अनुरोध/सेकंड है, तो लगभग सभी अनुरोधों को 5 सेकंड के भीतर संभाला जाएगा? एक वितरित वातावरण के बिना Erlang कैसे काम करता है? अन्य बैकएंड तकनीक ऐसा क्यों नहीं कर सकती (उदा। Node.js)?

Q3: वास्तविक समय scalability

वहाँ किसी भी उपलब्ध तकनीक/उपकरण/पुस्तकालय/सेवा या वास्तविक मामले जोड़ने Erlang स्वचालित रूप से नोड जब अनुरोध spikes पता लगाने के द्वारा पैमाने, और जैसे ही नीचे पैमाने पर उपयोग बूंदों के रूप में करने के लिए है?

Erlang/Elixir के लिए तैनाती/निगरानी/संचालन के प्रबंधन के लिए उपयुक्त उपकरण क्या हैं?

Q4: अनुकूलन

मैं उनकी सेवाओं का समर्थन करने के WhatsApp उपयोग Erlang पता है। उन्होंने एरलांग पर बहुत अनुकूलन किया। इसके बारे में कोई जानकारी? अगर हमें हमारी एर्लांग सेवाओं को अनुकूलित करने की ज़रूरत है, तो हम इसे कैसे शुरू कर सकते हैं?

+0

क्या आप कृपया क्यू 1 में दी गई तालिका को प्रारूपित कर सकते हैं। मुझे दिए गए क्यू 1 को समझ में नहीं आता है। –

+2

मुझे लगता है कि आपके प्रश्न बहुत व्यापक हैं और क्यू एंड ए प्रारूप के लिए बहुत उपयुक्त नहीं हैं। –

+0

अपने सवालों के जवाब देने के लिए, किसी को एक और पुस्तक लिखने की आवश्यकता होगी। – webdeb

उत्तर

13

प्रश्न 2 के उत्तर।

एलिक्सीर और एर्लांग स्पाइक्स को संभाल सकता है क्योंकि उनके वेब सर्वर आमतौर पर प्रत्येक अनुरोध के लिए एक नई एरलांग प्रक्रिया उत्पन्न करते हैं। यह प्राप्त करने योग्य है क्योंकि एर्ल प्रक्रियाएं ओएस प्रक्रियाओं और धागे की तुलना में अधिक हल्की हैं। कई अन्य भाषाएं कॉन्सुरेंसी के लिए ओएस थ्रेड का उपयोग करती हैं और होस्ट मशीन पर सीमित संसाधनों का प्रबंधन करने के लिए मतदान का उपयोग करती हैं।

सबसे बहुत ही मामूली सर्वर एक मिलियन से अधिक प्रक्रियाओं को संभाल सकते हैं। चूंकि प्रत्येक अनुरोध एक प्रक्रिया है, इसलिए प्रत्येक अनुरोध पूरा हो जाता है जब अनुरोध को पूरा करने के लिए आवश्यक सीपीयू संसाधन प्रदान किए जाते हैं।

प्रोसेस शेड्यूलिंग एरलांग सहकारी है, प्रीपेप्टिव नहीं है, जिससे ओएस में उन लोगों की तुलना में संदर्भ स्विच बहुत तेजी से हो सकते हैं। अंत में, Elixir और Erlang डिफ़ॉल्ट रूप से एक सीपीयू पर सभी कोर का उपयोग करें।

जब तक सर्वर पर्याप्त स्मृति के साथ कॉन्फ़िगर किया गया है और प्रक्रियाओं की संख्या स्टार्टअप चर उचित रूप से सेट है, तो यह बहुत ही व्यावहारिक है।

एरलांग वीएम दूरसंचार प्रणालियों के लिए कई फोनों के लिए समेकन का समर्थन करने के लिए डिजाइन किया गया था। यह शुरुआती दिनों में भी डिजाइन किया गया था जब स्मृति और सीपीयू आज की तुलना में बहुत सीमित था।

Q1

टी एल का जवाब; डॉ हाँ, अमृत पर्याप्त

अमृत Erlang वी एम, जो बहुत ही परिपक्व है पर निर्माण है परिपक्व है। यह दूरसंचार स्विच की नींव है जिसे Many Nines Reliability का समर्थन करना चाहिए। चूंकि एलीक्सिर एर्लांग वीएम पर चलता है, यदि विशिष्ट कार्यक्षमता में एलिक्सीर या एलिक्सीर निर्भरता गुम होती है, तो आप सीधे एलीक्सिर से एरलांग का उपयोग कर सकते हैं। साथ ही, आप एलीक्सिर प्रोजेक्ट में एलीक्सिर और एरलांग पैकेजों को मिलाकर मैच कर सकते हैं। Erlang परियोजना के साथ काम करते समय भी वही करता है।

निम्नलिखित अंक आपकी तालिका को संबोधित करना चाहिए।

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

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

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

+2

क्षैतिज स्केलिंग पहले से ही प्रदान किए गए लंबे समय तक एक बड़ा जवाब है। मुझे लगता है कि आपको यह Google करना चाहिए। आप कई 'वितरित erlang' से शुरू करना चाहते हैं और वहां से काम करना चाहते हैं। मल्टी-नोड मुख्य रूप से ईवीएम का एक कार्य है।Elixir स्थानीय और दूरस्थ प्रक्रियाओं के साथ काम करने के लिए समर्थन प्रदान करता है। –

+0

क्यू 2 के बारे में, यदि कोई मशीन केवल 1 एम अनुरोध/सेकेंड को संभाल सकती है, तो स्पाइक 2 एम ~ 5 एम अनुरोध/सेकंड होने पर एरलांग सर्वर क्या करेगा? क्या एरलांग सर्वर उन अनुरोधों को छोड़ देगा जो वर्तमान में इसे संभाल नहीं सकते हैं? –

+1

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

संबंधित मुद्दे