2011-04-23 19 views
7

संदर्भ: ओएस: लिनक्स (उबंटू), भाषा: सी (वास्तव में लुआ, लेकिन इससे कोई फर्क नहीं पड़ता)।अल्पकालिक प्रकाशक और दीर्घकालिक ग्राहकों के साथ PUB/SUB

मैं ज़ीरोएमक्यू-आधारित समाधान पसंद करूंगा, लेकिन पर्याप्त कुछ भी स्वीकार करूँगा।

नोट: तकनीकी कारणों से मैं यहां POSIX सिग्नल का उपयोग नहीं कर सकता।

मेरे पास एक मशीन ("श्रमिक") पर कई समान दीर्घकालिक प्रक्रियाएं हैं।

समय-समय पर मुझे कमांड लाइन उपकरण के माध्यम से प्रत्येक प्रक्रिया में एक नियंत्रण संदेश वितरित करने की आवश्यकता होती है। उदाहरण:

 
$ command-and-control worker-type run-collect-garbage 

इस मशीन पर प्रत्येक श्रमिक को run-collect-garbage संदेश प्राप्त होना चाहिए। नोट: यह सही होगा अगर समाधान किसी भी तरह क्लस्टर में सभी मशीनों पर सभी श्रमिकों के लिए काम करेगा, लेकिन मैं खुद ही वह हिस्सा लिख ​​सकता हूं।

यदि मैं श्रमिकों के बारे में कुछ जानकारी संग्रहीत करता हूं तो यह आसानी से किया जाता है। उदाहरण के लिए पीआईडी ​​को उनके लिए एक ज्ञात स्थान पर रखें और किसी भी पीआईडी ​​के साथ ज्ञात पथ पर यूनिक्स डोमेन सॉकेट को नियंत्रित करें। या कहीं भी टीसीपी सॉकेट और स्टोर होस्ट और बंदरगाह खोलें।

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

क्या PUB/SUB शैली में ऐसा करने का कोई अच्छा तरीका है? यही है, श्रमिक ग्राहक हैं, कमांड-एंड-कंट्रोल टूल एक प्रकाशक है, और वे सभी जानते हैं कि एक "चैनल यूआरएल" है, इसलिए कहने के लिए, संदेश पर आने के लिए।

अतिरिक्त आवश्यकताएं: नियंत्रण चैनल को

  • संदेश सर्वेक्षण से श्रमिकों को जगाने चाहिए (का चयन करें, जो कुछ भी) पाश।
  • संदेश डिलीवरी की गारंटी दी जा चाहिए, और यह प्रत्येक और हर कार्यकर्ता कि सुन रहा है तक पहुँचने चाहिए। आदर्श चुनाव/select/जो कुछ पाश ऊपर उल्लेख द्वारा -
  • कार्यकर्ता को रोके बिना संदेशों के लिए नजर रखने के लिए एक तरह से होना चाहिए।
  • आदर्श रूप से, कार्यकर्ता प्रक्रिया को एक अर्थ में "सर्वर" होना चाहिए - उसे "चैनल सर्वर" (यदि कोई हो) लगातार कनेक्शन से संबंध रखने के बारे में परेशान नहीं होना चाहिए - या यह ढांचे द्वारा पारदर्शी रूप से किया जाना चाहिए।

उत्तर

3

आमतौर पर ऐसे पैटर्न को प्रकाशक के लिए प्रॉक्सी की आवश्यकता होती है, यानी आप प्रॉक्सी को भेजते हैं जो तुरंत डिलीवरी स्वीकार करता है और फिर वह विश्वसनीय ग्राहक श्रमिकों के लिए विश्वसनीय रूप से आगे बढ़ता है। ज़ीरोएमक्यू गाइड में इसे लागू करने के कुछ अलग-अलग तरीकों को शामिल किया गया है। - श्रमिकों कि से कनेक्ट और कमांड उपकरण यह जो जुड़ा श्रमिकों को redistributes को धक्का एक डेमॉन जो दो ज्ञात सॉकेट पर सुनता चलाएँ:

http://zguide.zeromq.org/page:all

+1

एक और संभवतः उपयोगी चीज जो मैंने पाया वह खोज करने पर मुझे यह प्रश्न मिला: http://code.google.com/p/ops/ - मैंने इसका उपयोग नहीं किया है, और इस प्रकार बात नहीं कर सकता इसके लिए, अगर आप किसी भी तरह से zmq की कमी महसूस करते हैं तो इसे एक टिप्पणी के रूप में जोड़ना। – lindes

0

मुझे लगता है कि आप जो वर्णन कर रहे हैं वह एक गियरमैंड/पर्यवेक्षक कार्यान्वयन के साथ अच्छी तरह से फिट होगा।

Gearman एक महान कार्य कतार प्रबंधक है और supervisord आप यह सुनिश्चित करें कि प्रक्रिया (ते) सभी चल रहे हैं करने की अनुमति होगी। यह टीसीपी भी आधारित है ताकि आप ग्राहकों/विभिन्न मशीनों पर कार्यकर्ताओं हो सकता है।

http://gearman.org/

http://supervisord.org/

मैं हाल ही में कुछ कई gearmand नोड्स के साथ, सेट इतना है कि वहाँ असफलता का कोई एकल बिंदु

संपादित कई कार्यकर्ताओं से जुड़ा हुआ: खेद है - मेरा बुरा है, मैं बस फिर से पढ़ा और देखा कि यह आदर्श नहीं हो सकता है।

Redis में कुछ अच्छी और सरल दिखने वाली पब/उप कार्यक्षमता है जिसका मैंने अभी तक उपयोग नहीं किया है लेकिन वादा करता है।

+0

रेडिस पब/एसयूबी मेरे लिए काम नहीं करेगा - इसमें गैर-अवरुद्ध पढ़ने का कोई तरीका नहीं है, और जिन ग्राहकों के पास मेरे पास पहुंच है, वे मतदान/चयन लूप में कच्चे सॉकेट का पर्दाफाश नहीं करते हैं। –

0

एक mulitcast PUB/SUB का उपयोग करें। आपको यह सुनिश्चित करना होगा कि pgm विकल्प आपके ZeroMQ वितरण (man 7 zmq_pgm) में संकलित है।

+0

मल्टीकास्ट मेरे वीपीएस सर्वर पर काम नहीं करता है। :-( –

2

अपनी आवश्यकताओं को देखते हुए, स्टीव के सुझाव सरल प्रतीत होता है।

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

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