जब एंकर / एरलंग में अभिनेताओं का उपयोग करना अच्छा नहीं है?


58

मैं अब with-k महीने से रोजाना अक्का के साथ काम कर रहा हूं। जब मैंने शुरू किया, तो मैं अनुप्रयोगों और नोटिस पर काम कर रहा था कि ज्यादातर वस्तुओं के बीच संवाद स्थापित करने के लिए अभिनेता प्रणाली के अंदर एक बार कहीं भी अभिनेताओं का उपयोग किया जाएगा। तो मैंने ऐसा ही किया - x / y / z के लिए किसी अन्य अभिनेता को स्पिन करें।

यह मुझे लगता है कि यह बहुत अंधाधुंध हो सकता है, जहां जटिलता की आवश्यकता नहीं है - लेकिन मुझे इस बात पर कोई चर्चा नहीं मिल सकती है कि अभिनेताओं बनाम सादे तुल्यकालिक या यहां तक ​​कि वायदा के माध्यम से async तर्क का उपयोग कैसे किया जाना चाहिए। अपने सहकर्मी द्वारा कुछ इसी तरह का उल्लेख किए जाने के बाद मैंने अपने रुख पर विचार करना शुरू कर दिया। मुझे हाल ही में कई मामलों का एहसास हुआ, जहां मैंने एक कार्य को टाल दिया है और फिर एक और अभिनेता बनाने से परहेज किया है क्योंकि मैं एक अपरिवर्तनीय कार्यान्वयन में सुरक्षित रूप से एक ही परिणाम प्राप्त कर सकता हूं - जैसे कि एक db या फ़ाइल से कॉन्फ़िगरेशन मान प्राप्त करना कुछ ऐसा है जहां आप बहुत ही अनपेक्षित रूप से और इच्छा से पहुंचते हैं परिणाम की प्रतीक्षा वास्तविक उपयोग का मामला है।

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

तो मेरा सवाल है - क्या अभिनेताओं का उपयोग करने का कोई बुरा समय है? मैं उत्सुक हूं कि एरलांग कैसा दिखता है और वास्तव में अन्य लोगों की अंतर्दृष्टि को पसंद करेगा। या अगर अभिनेता के उपयोग के आसपास कुछ सिद्धांत हैं।


महीनों तक प्रतिदिन अक्का के साथ काम करने का क्या अवसर मिलता है?
डेन

3
अच्छे। :) या परिवर्तन खुद करें।
जेसन

मैं विशेष रूप से जानना चाहता हूं कि askएक अभिनेता के बीच व्यापार-नापसंद क्या है और सिर्फ एक सादे का उपयोग करके Future
मैक्स हाइबर

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

कई सालों बाद मैं एक erlang / elixir प्रोग्रामर हूं और मैं नई अंतर्दृष्टि के साथ इस पर वापस आ रहा हूं :) Elixir काफी अलग है क्योंकि प्रक्रियाओं के विकल्प के रूप में कोई वस्तु नहीं है इसलिए जब आपको राज्य की आवश्यकता होती है तो प्रक्रियाएं हमेशा बनाई जाती हैं । यह सिर्फ समवर्ती होना होता है। यह अभी भी सबसे अच्छा अनुमान है।
जेसन

जवाबों:


23

यह एक ऐसा सवाल है, जिसमें मुझे दिलचस्पी है और मैं इस पर कुछ शोध कर रहा हूं। अन्य दृष्टिकोणों के लिए, नोएल वाल्श द्वारा यह ब्लॉग पोस्ट देखें या स्टैक ओवरफ्लो पर यह प्रश्न । मेरे पास कुछ राय हैं जिन्हें मैं प्रस्तुत करना चाहता हूं:

  • मुझे लगता है कि अक्का, क्योंकि यह संदेशों के साथ काम करता है, एक "धक्का मानसिकता" को प्रोत्साहित करता है। अक्सर, संगोष्ठी के लिए, मैं यह तर्क दूंगा कि आप क्या चाहते हैं। पुल ज्यादा सुरक्षित है। उदाहरण के लिए वितरित सिस्टम के लिए एक सामान्य पैटर्न एक कतार में काम करने वाले श्रमिकों की जानकारी का एक सेट है । जाहिर है कि यह अक्का में संभव है, लेकिन यह जरूरी नहीं है कि पहला दृष्टिकोण लोगों की कोशिश हो । अक्का टिकाऊ मेलबॉक्स भी प्रदान करता है, लेकिन फिर से यह निर्भर करता है कि आप उनका उपयोग कैसे करते हैं - एक एकल साझा कतार शेष / पुनः-असाइन किए गए कार्य के लिए प्रति कार्यकर्ता कतार की तुलना में अधिक लचीली है।
  • अभिनेताओं के साथ अपनी कक्षाओं को बदलने की मानसिकता में आना आसान है। वास्तव में कुछ लोग यह भी कहते हैं कि अभिनेताओं को केवल एक काम करना चाहिए । इसे तार्किक निष्कर्ष पर ले जाया गया क्योंकि इससे कोड जटिलता बढ़ जाती है क्योंकि जेसन का वर्णन है, क्योंकि यदि हर वर्ग एक अभिनेता है, तो यह बहुत सारे अतिरिक्त संदेश हैं और ब्लॉक प्राप्त / भेजते हैं। इससे कोड को समझना और परीक्षण करना भी कठिन हो जाता है क्योंकि आप इंटरफेस की औपचारिकता खो देते हैं - और मुझे यकीन नहीं है कि टिप्पणियाँ इस का समाधान हैं । इसके अलावा अक्का की महान दक्षता के बावजूद , मुझे संदेह है कि अभिनेता प्रसार एक अच्छा विचार प्रदर्शन बुद्धिमान नहीं है - जब हम जावा थ्रेड्स का उपयोग करते हैं तो हम जानते हैं कि वे कीमती हैं और तदनुसार उनका संरक्षण करते हैं।
  • यह पिछले बिंदु से संबंधित है, लेकिन एक और झुंझलाहट प्रकार की जानकारी का नुकसान है जो नोएल और पिनो को उजागर करती है, जैसा कि हम में से कई के लिए है कि हम पायथन जैसे अन्य भाषाओं के बजाय स्काला का उपयोग कर रहे हैं। इसके आसपास कुछ तरीके हैं, लेकिन वे या तो गैर-मानक हैं , अनुशंसित या प्रयोगात्मक नहीं हैं
  • अंत में समसामयिकता, भले ही आपके पास "इसे दुर्घटनाग्रस्त होने दें" मानसिकता हो, कठिन है। वैकल्पिक प्रोग्रामिंग मॉडल मदद कर सकते हैं लेकिन वे समस्याओं को दूर नहीं करते हैं - वे उन्हें बदलते हैं - यही कारण है कि औपचारिक रूप से उनके बारे में सोचना अच्छा है । यह इसलिए भी है कि RabbitMQ, स्टॉर्म, Hadoop, Spark, Kafka या SSQL डेटाबेस जैसे तैयार किए गए टूल के लिए जो एवरेज डेवलपर पहुंचता है। अक्का में कुछ पूर्वनिर्मित उपकरण और घटक हैं, जो शांत है, लेकिन यह काफी निम्न स्तर भी महसूस करता है, इसलिए वितरित सिस्टम के अधिक तैयार सामान्य तत्व डेवलपर्स को मदद करेंगे और यह सुनिश्चित करेंगे कि सिस्टम सही तरीके से निर्मित हों।

जेसन की तरह, मैं अन्य लोगों की अंतर्दृष्टि को सुनने के लिए उत्सुक हूं। मैं ऊपर दिए गए कुछ मुद्दों को कैसे संबोधित कर सकता हूं और अक्का का बेहतर उपयोग कर सकता हूं?


1
मैंने यह पोस्ट अक्का स्पॉट-ऑन टाइमगिलबर्ट.वर्डप्रेस.कॉम 2013
मार्क बटलर

"इनहेरिटेंस पर रचना" अभी भी निर्भरता इंजेक्शन के लिए उपयोगी है। उदाहरण के लिए, प्रॉपर के रूप में निर्भरता को पास करें (कंस्ट्रक्टर पार्म्स का उपयोग करता है)। तब समस्या पर्यवेक्षण की होगी - निर्मित अभिनेता की देखरेख अभिनेता के अलावा कहीं और की जाएगी। एक राउटर का उपयोग शीर्ष स्तर पर बनाए गए अभिनेताओं के आसपास पर्यवेक्षण रणनीति को लपेटने के लिए किया जा सकता है, लेकिन पवित्र जो अब बहुत जटिल है! मुझे लगता है कि केक एक बेहतर समाधान होगा - उदाहरण के लिए db सेवा अभिनेता के लिए अभिनेता निर्माण के साथ एक विशेषता है। तो बस पाठ संदर्भ में एक परीक्षण नकली / ठूंठ डीबी सेवा विशेषता का उपयोग करें।
जेसन

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

मुझे लगता है कि यह एक बुरा विचार नहीं है - धन्यवाद चिह्न - मैं वास्तव में इस बारे में थोड़ा लिखने और इसे सामाजिक बनाने की कोशिश कर सकता हूं। तुम कुछ है कि शायद प्रॉप्स देता है इंजेक्षन कर सकते हैं? एक्टर का एक प्रकार का कारखाना जहां उपभोक्ता अभिनेता को इंस्टेंट कर सकता है। उदाहरण के लिए def विधि (arg) = उस (psuedo?) कारखाने से Props (new ActorWithArgs (arg)) लौटें ताकि आप अभिनेता को सही संदर्भ में बना सकें। यह एक अच्छा विचार और डि के लिए केक समाधान के लिए एक अच्छा लक्ष्य जैसा लगता है।
जेसन

मैंने अभी इस कोर्स का अनुसरण करना शुरू किया है: coursera.org/course/posa हालांकि यह मुख्य रूप से एंड्रॉइड प्रोग्रामिंग करने वाले लोगों के उद्देश्य से है, यह जावा में कंसर्ट में एक अच्छा अवलोकन भी है। तो एक बात जो मैं सोच रहा था, "क्या कुछ घंटियाँ और सीटी के साथ इवेंट लूप्स का सिर्फ फैंसी रूप नहीं है (क्योंकि आप इवेंट लूप्स को अलग-अलग धागों में डाल सकते हैं)?"
मार्क बटलर

21

यह विचार करने योग्य है कि अभिनेता मॉडल किसके लिए उपयोग किया जाता है: अभिनेता मॉडल है

  1. एक संगामिति मॉडल
  2. वह म्यूट करने के लिए समवर्ती पहुँच से बचता है
  3. समरूपता प्रदान करने के लिए अतुल्यकालिक संचार तंत्र का उपयोग करना।

यह मूल्यवान है क्योंकि कई धागों से साझा स्थिति का उपयोग करना वास्तव में कठिन हो जाता है, खासकर जब साझा राज्य के विभिन्न घटकों के बीच संबंध होते हैं जिन्हें सिंक्रनाइज़ रखा जाना चाहिए। हालाँकि, यदि आपके पास डोमेन घटक हैं:

  • आप संक्षिप्तता की अनुमति नहीं देते, या
  • आप परिवर्तनशील स्थिति (कार्यात्मक प्रोग्रामिंग में) की अनुमति नहीं देते, या
  • आपको कुछ तुल्यकालिक संचार तंत्र पर भरोसा करना चाहिए,

तब अभिनेता मॉडल ज्यादा (यदि कोई हो) लाभ प्रदान नहीं करेगा।

उम्मीद है की वो मदद करदे।


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

मुझे लगता है कि रेडिस के साथ संवाद करने के लिए ज़िम्मेदार अभिनेता को अपवाद और फिर से शुरुआत मिलेगी।
जेसन सेप

@ जैसन जी मेरे दिमाग में, "दोष सहिष्णुता" सामान्य रूप से अभिनेता मॉडल का एक पहलू नहीं है - यह कुछ ऐसा है जो एर्लांग (और शायद अक्का?) में अभिनेता मॉडल कार्यान्वयन के साथ आता है। मैं रेडिस से बात नहीं कर सकता, हालांकि मुझे स्वीकार करना होगा, "अपरिवर्तनीय ग्राहक" मुझे अजीब लगता है ... यदि कोई सॉफ़्टवेयर घटक विफल हो सकता है, तो मैं यह नहीं देखता कि इसे कैसे अपरिवर्तनीय माना जा सकता है।
०४:३५ पर ऐडन कलली सिप

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

12

आपका अंतर्ज्ञान सही है, IMHO। हर जगह अभिनेताओं का उपयोग लौकिक हथौड़ा होने और केवल नाखून देखने जैसा है।

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


अच्छा है धन्यवाद। मुझे वास्तव में यह देखने में दिलचस्पी है कि इस चर्चा में क्या होता है।
जेसन

0

इनपुट / आउटपुट संदेश के क्रम में:

मैं हाल ही में एक एक्का-आधारित एप्लिकेशन के साथ मिला था, जहां अभिनेता मॉडल वास्तव में संगामिति समस्याओं का कारण था, एक सरल मॉडल लोड के साथ बेहतर रूप से पर्याप्त होगा।

समस्या यह थी कि आने वाले संदेश अलग-अलग 'लेन' में (विभिन्न अभिनेता पथों के माध्यम से) चल रहे थे, लेकिन कोड ने माना कि संदेश अपने अंतिम गंतव्य पर उसी क्रम में पहुंचेंगे, जिस क्रम में वे आए थे। जब तक डेटा पर्याप्त रूप से बड़े अंतराल के साथ आता है, तब तक यह काम करता है क्योंकि गंतव्य के लिए केवल एक ही परस्पर विरोधी संदेश रेसिंग होगा। जब अंतराल कम हो गया तो वे क्रम से बाहर निकलने लगे और अजीब व्यवहार करने लगे।

समस्या को थोड़ा कम अभिनेताओं के साथ सही ढंग से हल किया जा सकता था, लेकिन जब उन्हें प्रयोग किया जाता है, तो यह एक आसान गलती है।


यह मूलभूत और व्यापक रूप से प्रासंगिक है। आप केवल दो अभिनेताओं के बीच ऑर्डर की गारंटी दे सकते हैं। doc.akka.io/docs/akka/current/scala/general/… आप किसी भी सिस्टम में ऑर्डर डिलीवरी की गारंटी नहीं दे सकते हैं, जहां आप बाहर / पंखे लगाते हैंandreasohlund.net/2012/01/18/dont-assume-message-ordering
जेसन

-1

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

हर प्रक्रिया कॉल के साथ पास किया जा रहा एक बड़ा ढांचा ढेर का उपयोग कर सकता है। इस स्थिति को एक अलग प्रक्रिया में रखा जा सकता है, संरचना को एक प्रक्रिया आईडी द्वारा प्रतिस्थापित किया जाता है, और उस प्रक्रिया को आवश्यक आधार पर समझा जाता है।

माईनेसिया जैसे डेटाबेस को बाह्य रूप से क्वेरी प्रक्रिया के रूप में संग्रहीत करने के बारे में सोचा जा सकता है।


1
क्या आप स्पष्ट कर सकते हो? क्या आपका मतलब नेटवर्क भर में बड़ा राज्य है? एक स्थानीय प्रक्रिया में एक अपरिवर्तनीय संरचना के संदर्भ में गुजरने की लागत लगभग नहीं होती है और आप परिवर्तनशील संरचनाओं को पारित नहीं कर सकते हैं। यह मानते हुए कि आप एक बड़े परिवर्तनशील ढांचे के बारे में बात कर रहे हैं जिसे भेजने के लिए प्रतिलिपि बनाने की आवश्यकता है? तो यह मूल रूप से एक ही बात फिर से साझा राज्य है। आकार वास्तव में कुछ भी नहीं बदलता है। अगर मैं गलत समझ रहा हूं तो मुझे बताएं।
जेसन

तो आप संदर्भ से कैसे गुजरते हैं? निश्चित रूप से ऐसा करने का तरीका संरचना को एक प्रक्रिया में रखना है और प्रक्रिया को पारित करना है। लोकल कॉल डेटा को स्टैक पर डाल देगा, और प्रत्येक पुनरावर्ती कॉल इसे फिर से करेगा (पूंछ पुनरावृत्ति के अपवाद के साथ)। संरचना के पुनरावर्ती प्रसंस्करण को एक कॉल से दूसरे राज्य में स्थानांतरित करने के लिए सूचियों का उपयोग करके किया जा सकता है, यह राज्य फिर अन्य प्रक्रिया में संरचना का संदर्भ दे सकता है।
टोनी वालेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.