2012-05-03 15 views
9

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

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

जो मैं खोज रहा हूं वह सी या सी ++ में इस संदेश कतार को कार्यान्वित करने के लिए सिफारिशें हैं। ऐसा लगता है कि POSIX और Boost संदेश कतार एक मेजबान तक सीमित हैं, और RabbitMQ में कमजोर सी/सी ++ समर्थन होता है, और MQ4CPP एक व्यापार-महत्वपूर्ण भूमिका के लिए अपर्याप्त रूप से समर्थित लगता है। क्या मैं इस बारे में गलत हूं? बूस्ट ASIO या ACE या सॉकेट कोड लिखने के बारे में क्या? मैं आपके सुझावों की प्रतीक्षा करता हूं।

+2

[ज़ीरोएमक्यू बहुत अच्छा है] (http://www.zeromq.org)। – user7116

+0

महान उत्तर, हर कोई, लेकिन मुझे वास्तव में ज़ीरोएमक्यू की सादगी पसंद है। यदि @sixlettervariables इसे उत्तर देने के लिए थे, तो मैं इसे स्वीकार करूंगा। –

उत्तर

8

सरल संदेश समर्थन, ZeroMQ is hard to beat के संदर्भ में। यह कई भाषा बाइंडिंग में उपलब्ध है और सरल भेजने से सबकुछ का समर्थन करता है और पब/उप, प्रशंसक, या यहां तक ​​कि एक मैसेजिंग पाइपलाइन भी प्राप्त करता है। कोड पचाने में भी आसान है और पैटर्न के बीच स्विच करना बहुत आसान बनाता है।

उनके Weather Update Server sample (20 में कुछ अजीब भाषाओं) को देखते हुए पता चलता है कितना आसान है बनाने के लिए प्रकाशित/सेटअप सदस्यता ले जा सकता है:

zmq::context_t context (1); 
zmq::socket_t publisher (context, ZMQ_PUB); 
publisher.bind("tcp://*:5556"); 
publisher.bind("ipc://weather.ipc"); 

while(1) { 
    // Send message to all subscribers 
    zmq::message_t message(20); 
    snprintf ((char *) message.data(), 20 , 
     "%05d %d %d", zipcode, temperature, relhumidity); 
    publisher.send(message); 
} 

मैं पर कुछ मिश्रित सी # और भी बहुत परेशानी के बिना अजगर प्रक्रियाओं में इसका इस्तेमाल किया गया है ।

1

मैं बूस्ट सीरियलाइजेशन और सॉकेट को इसी तरह के एप्लिकेशन के लिए भेज रहा हूं। आप यहाँ क्रमबद्धता का एक उदाहरण देख सकते हैं:

http://code.google.com/p/cloudobserver/wiki/TutoriaslBoostSerialization

और इस पृष्ठ पर:

http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/examples.html

क्रमबद्धता के तहत आप कैसे सर्वरों और ग्राहकों को बनाने के लिए पर उदाहरण मिल जाएगा। एक सर्वर को एक विशेष पोर्ट पर बनाएं और आप कई कंप्यूटरों पर एकाधिक क्लाइंट जेनरेट कर सकते हैं जो उस पोर्ट के साथ संवाद कर सकते हैं।

बूस्ट सीरियलाइजेशन का उपयोग करने के लिए नकारात्मक पक्ष यह है कि यदि आपके पास सीरियलाइज्ड होने के लिए एक साधारण डेटा संरचना है तो यह एक बड़ा ओवरहेड है लेकिन इससे यह आसान हो जाता है।

2

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

सॉकेट एपीआई सीखने के लिए सबसे अच्छा संसाधनों में से एक हैं:

  • बीज की गाइड नेटवर्क प्रोग्रामिंग करने के लिए: http://beej.us/guide/bgnet/, यह बहुत अच्छा है अगर तुम इसके अलावा में समग्र प्रोग्रामिंग मॉडल की जरूरत है बारीकियों है
  • मैन पेज : यदि आपको केवल फ़ंक्शन हस्ताक्षर की आवश्यकता है, मान वापस करें, और तर्क, ये सब आपको चाहिए। मैं लिनक्स वाले बहुत अच्छी तरह से लिखा होना चाहिए और उपयोगी (सबूत पाते हैं: मेरे कंसोल को देखो: man, man, man, man, man, make, man, ...)

इसके अलावा, डेटा नेटवर्क भेजने के लिए, यदि आपका डेटा JSON है, तो आपको कोई चिंता नहीं है। चूंकि जेएसओएन सिर्फ एएससीआईआई (या यूटीएफ -8) है, इसलिए इसे नेटवर्क पर केवल एक लम्बा हेडर के साथ कच्चा भेजा जा सकता है। जब तक आप बाइनरी में कुछ जटिल भेजने की कोशिश नहीं करते हैं, यह सही होना चाहिए (यदि आपको बाइनरी में जटिल की आवश्यकता है, तो या तो क्रमबद्धता को देखें या Segmentation Fault के लिए तैयार करें)।


इसके अलावा, यदि आप सॉकेट पथ पर जाते हैं, तो टीसीपी का उपयोग करना चाहते हैं। यद्यपि यूडीपी आपको एक तरफा पहलू देगा, तथ्य यह है कि इसे विश्वसनीय बनाने के लिए लिनक्स कर्नेल द्वारा दिए गए टॉप-ऑफ-द-लाइन टीसीपी के खिलाफ अपना घर-बेक्ड समाधान डालना है, टीसीपी एक स्पष्ट विकल्प है।

1

एक और सिफारिश वितरित ढांचे OpenCL है। दस्तावेज़ The OpenCL C++ Wrapper for API लाइब्रेरी पर और जानकारी प्रदान करता है। विशेष रूप से, एपीआई फ़ंक्शन cl::CommandQueue नेटवर्क सेटअप के भीतर डिवाइस पर कतार बनाने के लिए रुचि का हो सकता है।

2

खरगोश एमक्यू AMQP का केवल एक कार्यान्वयन है। आप Apache Qpid या अन्य वेरिएंट की जांच करना चाहेंगे जो अधिक सी/सी ++ अनुकूल हो सकते हैं। सी के लिए libamqp है हालांकि मेरे पास इसका पहला हाथ अनुभव नहीं है। मुझे नहीं पता कि आपकी आवश्यकताओं क्या है, लेकिन एएमक्यूपी, उचित रूप से कार्यान्वित, औद्योगिक ताकत है और कम से कम समय में हाथ से निर्माण करने वाली किसी भी चीज की तुलना में तीव्रता और अधिक स्थिरता के आदेश होना चाहिए।

1

एक और संदेश समाधान ICE (http://www.zeroc.com/) है। यह बहु मंच, बहु भाषा है। यह एक आरपीसी दृष्टिकोण का अधिक उपयोग करता है।

+0

हालांकि यह एक अच्छा उत्पाद है, [आईसीई जीपीएल है] (http://www.zeroc.com/licensing.html)। जब तक आपका कोड जीपीएल भी न हो या वाणिज्यिक लाइसेंस के लिए भुगतान करने को तैयार न हो, मैं इसे स्पष्ट कर दूंगा। – Void

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