संदेशवाहक समाधान जैसे कि WebSphere MQ या Tibco Rendezvous के बजाय अभिनेताओं का उपयोग कब करें?


106

मैंने पहले ही सवाल और जवाब पढ़ लिए हैं कि जेएमएस के बजाय स्काला के अभिनेताओं के लिए कौन से डिजाइन फैसले का पक्ष लेंगे?

आमतौर पर, हम ऐसे मैसेजिंग समाधानों का उपयोग करते हैं जो पहले से ही वर्षों से मौजूद हैं: या तो JMS कार्यान्वयन जैसे कि WebSphere MQ या Apache ActiveMQ का उपयोग प्वाइंट-टू-पॉइंट संचार के लिए किया जाता है, या मल्टीकास्ट मैसेजिंग के लिए टिब्बो रेन्डेवस।

वे बहुत स्थिर हैं, सिद्ध हैं और उच्च उपलब्धता और प्रदर्शन प्रदान करते हैं। फिर भी, विन्यास और सेटअप अक्का की तुलना में बहुत अधिक जटिल है।

मुझे कुछ उपयोग के मामलों के लिए अक्का का उपयोग कब और क्यों करना चाहिए जहां उपरोक्त उत्पाद - वेबस्फेयर एमक्यू या एक्टिवएमक्यू - का अब तक सफलतापूर्वक उपयोग किया गया है? मुझे अपने भविष्य के प्रोजेक्ट में WebSphere MQ या Tibco RV के बजाय अक्का का उपयोग करने पर विचार क्यों करना चाहिए?

और मुझे अक्का से कब बचना चाहिए? क्या यह अन्य समाधानों की तरह ही उच्च उपलब्धता और प्रदर्शन प्रदान करता है? या अक्का की तुलना अन्य मैसेजिंग मिडवाइवर्स से करना भी एक बुरा विचार है?

हो सकता है कि JVM वातावरण में एक और मैसेजिंग सॉल्यूशन भी हो, जिसे मुझे JMS (प्वाइंट-टू-पॉइंट), टिब्कोआरवी (मल्टीकास्ट) और अक्का के अलावा विचार करना चाहिए?


2
stackoverflow.com/questions/4648280/scala-actors-vs-jms/… उपयोगी हो सकता है।
srnm

जवाबों:


92

पहले "पुराने" संदेश सिस्टम (एमक्यू) कार्यान्वयन में पुराने हैं, लेकिन वे इंजीनियरिंग के विचार में एक नए हैं: लेन-देन की निरंतर कतार । स्काला एक्टर्स और अक्का शायद एक नया कार्यान्वयन है, लेकिन एक्टर्स के पुराने संगामिति मॉडल पर बनाया गया है।

दो मॉडल लेकिन व्यवहार में बहुत समान होने क्योंकि वे दोनों घटना आधारित संदेश हैं अंत: करने के लिए मेरा उत्तर देखें बनाम अक्का RabbitMQ

यदि आप केवल JVM के लिए कोड करने जा रहे हैं तो अक्का शायद एक अच्छा विकल्प है। अन्यथा मैं RabbitMQ का उपयोग करता।

इसके अलावा, यदि आप एक स्काला डेवलपर हैं, तो अक्का को बिना दिमाग वाला होना चाहिए। हालांकि अक्का के जावा बाइंडिंग बहुत जावा-ईश नहीं हैं और स्काला के टाइप सिस्टम के कारण कास्टिंग की आवश्यकता होती है।

जावा में भी लोग आमतौर पर अपरिवर्तनीय वस्तुएं नहीं बनाते हैं जो मैं आपको संदेश भेजने के लिए सुझाता हूं। नतीजतन जावा में गलती से अका का उपयोग करके कुछ करना आसान होगा जो स्केल नहीं करेगा (संदेशों के लिए परस्पर वस्तुओं का उपयोग करके, अजीब करीबी कॉलबैक स्थिति पर निर्भर करता है)। एमक्यू के साथ यह कोई समस्या नहीं है क्योंकि संदेश हमेशा गति की कीमत पर क्रमबद्ध होते हैं। अक्का के साथ वे आम तौर पर नहीं होते हैं।

अक्का भी अधिकांश एमक्यू की तुलना में बड़ी मात्रा में उपभोक्ताओं के साथ बेहतर है। ऐसा इसलिए है क्योंकि अधिकांश MQ (JMS, AMQP) क्लाइंट्स के लिए हर कतार कनेक्शन के लिए एक थ्रेड की आवश्यकता होती है ... इस प्रकार बहुत सारी कतारें == बहुत सारे स्थायी रूप से चलने वाले धागे। यह मुख्य रूप से एक ग्राहक समस्या है। मुझे लगता है कि ActiveMQ अपोलो में एक गैर-अवरोधक डिस्पैचर है जो एएमक्यूपी के लिए उस मुद्दे को स्पष्ट रूप से ठीक करता है। RabbitMQ क्लाइंट के पास ऐसे चैनल हैं जो आपको कई उपभोक्ताओं को संयोजित करने की अनुमति देते हैं लेकिन अभी भी बड़ी संख्या में उपभोक्ताओं के साथ समस्याएँ हैं जो संभावित रूप से गतिरोध या कनेक्शन का कारण बनते हैं इसलिए इस समस्या से बचने के लिए आमतौर पर अधिक थ्रेड जोड़े जाते हैं।

यह कहा जा रहा है कि अक्का की रीमोटिंग नई है और शायद अभी भी सभी विश्वसनीय संदेश गारंटी और क्यूओएस की पेशकश नहीं करता है जो पारंपरिक संदेश कतार प्रदान करते हैं (लेकिन यह हर रोज बदल रहा है)। इसका आम तौर पर सहकर्मी से सहकर्मी भी है, लेकिन मुझे लगता है कि सर्वर-टू-पीयर का समर्थन करता है जो आम तौर पर ज्यादातर MQ सिस्टम करते हैं (यानी विफलता का एकल बिंदु) लेकिन MQ सिस्टम हैं जो पीयर-टू-पीयर (RabbitMQ) सर्वर- हैं झांकना)।

अंत में RabbitMQ और अक्का वास्तव में एक अच्छी जोड़ी बनाते हैं। आप विशेष रूप से RabbitMQ के लिए एक रैपर के रूप में अक्का का उपयोग कर सकते हैं क्योंकि RabbitMQ संदेशों की खपत को संभालने और संदेशों को स्थानीय रूप से (एक JVM में) रूट करने में आपकी मदद नहीं करता है।

अक्का कब चुनना है

  • बहुत सारे उपभोक्ता हैं (लाखों सोचो)।
  • कम विलंबता की आवश्यकता है
  • एक्टर कंसीडर मॉडल के लिए खोलें

उदाहरण प्रणाली: एक इंटरैक्टिव वास्तविक समय चैट प्रणाली

एमक्यू कब चुनें

  • विभिन्न प्रणालियों के कई (यानी गैर JVM) के साथ एकीकृत करने की आवश्यकता
  • विलंबता की तुलना में संदेश की विश्वसनीयता अधिक महत्वपूर्ण है
  • अधिक उपकरण और व्यवस्थापक UI पसंद करेंगे
  • लंबे चलने वाले कार्यों के लिए पिछले अंक बेहतर होने के कारण
  • अभिनेताओं की तुलना में एक अलग संगामिति मॉडल का उपयोग करना चाहेंगे

उदाहरण प्रणाली: एक अनुसूचित लेन-देन बैच प्रसंस्करण प्रणाली

संबंधित टिप्पणियों के आधार पर EDIT

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

कम विलंबता अनुप्रयोगों के लिए सही संगामिति मॉडल / पुस्तकालय चुनना बहुत महत्वपूर्ण है। संदेश कतार के रूप में एक वितरित प्रसंस्करण समाधान आमतौर पर आदर्श नहीं होता है क्योंकि मार्ग लगभग हमेशा तार पर किया जाता है जो स्पष्ट रूप से आवेदन की तुलना में धीमा होता है और इस प्रकार अक्का एक बेहतर विकल्प होगा। हालांकि मेरा मानना ​​है कि कुछ मालिकाना एमक्यू प्रौद्योगिकियां स्थानीय रूटिंग के लिए अनुमति देती हैं। जैसा कि मैंने पहले उल्लेख किया है कि ज्यादातर MQ क्लाइंट थ्रेडिंग के बारे में बहुत बेवकूफ हैं और गैर-अवरुद्ध IO पर भरोसा नहीं करते हैं और प्रति कनेक्शन / कतार / चैनल के लिए एक धागा है ... विडंबना यह है कि गैर-अवरोधक io हमेशा कम विलंबता नहीं है लेकिन आम तौर पर अधिक संसाधन है कुशल।

जैसा कि आप वितरित प्रोग्रामिंग के विषय को देख सकते हैं और समवर्ती प्रोग्रामिंग बल्कि बड़ी है और हर रोज बदल रही है, इसलिए मेरा मूल इरादा भ्रमित नहीं था, बल्कि वितरित संदेश प्रसंस्करण के एक विशेष क्षेत्र पर ध्यान केंद्रित करना है जो कि मैं हालांकि ओपी के साथ संबंध था। संगामिति के संदर्भ में, कोई व्यक्ति अपनी खोजों को "प्रतिक्रियाशील" प्रोग्रामिंग (RFP / स्ट्रीम) पर केंद्रित करना चाहता है, जो कि "नया" है, लेकिन अभिनेता मॉडल और संदेश कतार मॉडल के समान मॉडल है, जिसमें इन सभी मॉडलों को आम तौर पर जोड़ा जा सकता है क्योंकि वे घटना आधारित हैं।


3
मुझे लगता है कि गलत प्रश्न का उत्तर सही नहीं हो सकता। आप एक संदेश कतार और एक संगामिति मॉडल की तुलना नहीं कर सकते। वे विभिन्न कार्यों को हल करने के लिए बनाए गए हैं और उनमें केवल "संदेश" शब्द है।
इगोर एस।

2
खैर हां और ना। अक्का वितरित संदेश का समर्थन करता है और आप संदेश कतार प्रतिमान (Google स्प्रिंग रिएक्टर) से बहुत आसानी से संगामिति मॉडल का निर्माण कर सकते हैं। वास्तव में अब एकमात्र अंतर यह है कि RabbitMQ में टिकाऊ संदेश हैं .. ओह प्रतीक्षा अक्का का समर्थन करता है कि अब भी। वह शीर्षक में "अभिनेता" कह सकते हैं लेकिन स्पष्ट रूप से अक्का बताते हैं जिसमें कई संदेश आधारित सिस्टम (समवर्ती और वितरित दोनों) के साथ बड़े पैमाने पर ओवरलैप है।
एडम जेंट

4
BTW @IgorS। आम तौर पर संदेश कतारों के साथ उपयोग किए जाने वाले संगामिति मॉडल को SEDA (मंचित घटना संचालित वास्तुकला) कहा जाता है। क्वीन्स, टॉपिक्स, और एक्सचेंजों का उपयोग करने के अलावा, अपने आप में एक संगामिति मॉडल है (यह सिर्फ मॉडल वितरित करने के लिए होता है .. अभिनेता मॉडल की तरह ही)। मैं भी वास्तव में घृणा करता हूं जब कोई "गलत प्रश्न" कहता है .. अनुचित प्रश्नों के अलावा, एक प्रश्न गलत कब हो सकता है? इसके भद्दे और अभिजात्य वर्ग के लिए ऐसा कुछ कहना।
एडम जेंट

1
मैंने कभी नहीं कहा कि वे विनिमेय थे। मैं यहां तक ​​कहता हूं कि वे एक साथ और क्यों महान काम करते हैं। लेकिन वह स्पष्ट रूप से यहां एक्‍का वितरित करने की बात कर रहे हैं न कि एक्‍का पुस्‍तकालय की। मैं इसे कैसे पढ़ता हूं। मेरी पोस्ट को संपादित करने के लिए स्वतंत्र महसूस करें क्योंकि आपकी बात वैध है और दूसरों को भ्रमित कर सकती है जो पोस्ट पर ठोकर खाते हैं।
एडम गेंट

1
एक अक्का जावा एपीआई - यह अब बहुत साफ है, विशेष रूप से जेडीके 8 लैम्ब्डा के साथ। मुझे संदेह है कि यह बेहतर होगा अगर / जब वे JDK 10 के साथ मूल्य वस्तुओं का परिचय देते हैं
रोब क्रॉफोर्ड

4

मैं मैसेजिंग सिस्टम का विशेषज्ञ नहीं हूं, लेकिन आप उन्हें अपने ऐप्स में अक्का के साथ जोड़ सकते हैं, दोनों दुनिया के सर्वश्रेष्ठ मिल सकते हैं। यहाँ एक उदाहरण है जो आपको अक्का और मैसेजिंग सिस्टम के साथ प्रयोग करने के लिए उपयोगी लग सकता है, इस मामले में ZeroMQ:

https://github.com/zcox/akka-zeromq-java


6
ZeroMQ वास्तव में एक संदेश प्रणाली नहीं है। बल्कि यह किसी प्रकार की बेहतर सॉकेट है। ZeroMQ की तुलना में पूर्ण विकसित मैसेजिंग सिस्टम बहुत अधिक जटिल हैं। आपके लिंक पर प्रोजेक्ट अक्का के साथ ZeroMQ के आसपास सिर्फ एक पतला आवरण है।
व्लादिमीर मतावेव

1

अक्का-ऊंट, जीरोएमक्यू की तुलना में एक बेहतर उदाहरण होगा - जीरोएमक्यू एक सीधा टीसीपी से टीसीपी संचार है (इसलिए शून्य - कोई संदेश कतार नहीं है)।

AkkaCamel के साथ आप कतार से दूर हो सकते हैं और संदेश कतार संदेश धक्का / खींचने के साथ निपटने के लिए किसी भी कोड के बिना एक अभिनेता से सीधे संदेश का उत्पादन / उपभोग कर सकते हैं।

आप एक्का-ज़ेरोमक को छोड़ सकते हैं और रेकोटिंग के साथ सीधे अक्का का उपयोग कर सकते हैं। मुझे लगता है कि कोर लाइब्रेरी से अक्का-ज़ीरोमक को हटाया जा रहा है, लेकिन हमने अक्का के लिए एक अच्छा ज़र्कोम लाइब्रेरी बनाया, जिसे स्कला-ज़ीरोमक कहा जाता है ( https://github.com/mDialog/scala-zeromq )

अक्का में कुछ प्रमुख कोर उपयोग मामले हैं:

१) परस्पर अवस्था

एक अभिनेता में छिपाकर साझा स्थिति को संभालना आसान है। जैसा कि अभिनेता संदेशों को समकालिक रूप से संभालते हैं, आप एक अभिनेता में स्थिति पकड़ सकते हैं और अभिनेता एपीआई के माध्यम से उच्च स्थिरता के साथ उस क्षेत्र को उजागर कर सकते हैं

2) वितरण

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

यहां अक्का-कैमल के साथ एक्टिवएमक्यू के साथ अक्का का उपयोग करने का एक उदाहरण है (जावा 8 का उपयोग करके)

import akka.actor.Props;
import akka.camel.Camel;
import akka.camel.CamelExtension;
import akka.testkit.TestActorRef;
import akka.testkit.TestProbe;
import org.junit.Ignore;
import org.junit.Test;
import akka.camel.javaapi.UntypedProducerActor;
import akka.camel.javaapi.UntypedConsumerActor;
import static com.rogers.totes.TotesTestFixtures.*;
import org.apache.activemq.camel.component.*;

public class MessagingTest {
    @Test @Ignore
    public void itShouldStoreAMessage() throws Exception{
        String amqUrl = "nio://localhost:61616";
        Camel camel = (Camel) CamelExtension.apply(system);
        camel.context().addComponent("activemq", ActiveMQComponent.activeMQComponent(amqUrl));

        TestProbe probe = TestProbe.apply(system);
        TestActorRef producer = TestActorRef.create(system, Props.create((Producer.class)));
        TestActorRef consumer = TestActorRef.create(system, Props.create((Consumer.class)));
        producer.tell("Produce", probe.ref());

        Thread.sleep(1000);
    }
}

class Producer extends UntypedProducerActor{

    @Override
    public String getEndpointUri() {
        return "activemq:foo.bar";
    }
}

class Consumer extends UntypedConsumerActor{

    @Override
    public String getEndpointUri() {
        return "activemq:foo.bar";
    }

    @Override
    public void onReceive(Object message) throws Exception {
        System.out.println("GOT A MESSAGE!" + message);

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