MonsterMQ भाग 4 के साथ RabbitMQ का उपयोग करना

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

कतार और एक्सचेंजर के बीच लिंक


पिछले लेख में, हमने सीखा कि एक कतार को एक एक्सचेंजर से कैसे जोड़ा जाए। इस कोड के बारे में:

$producer->queue('queue-1')->bind('logs');

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

$producer->queue('queue-2')->bind('logs', 'binding-key');

बाध्यकारी कुंजी का मूल्य एक्सचेंजर के प्रकार पर निर्भर करता है। पिछले पाठ से प्रशंसक विनिमयकर्ता केवल इस मूल्य की उपेक्षा करता है।

प्रत्यक्ष एक्सचेंजर


पिछले लेख से हमारा लॉगिंग सिस्टम सभी प्राप्तकर्ताओं को सभी संदेश भेजता है।

आइए इसे थोड़ा बदलें ताकि यह गंभीरता स्तर के आधार पर संदेशों को फ़िल्टर करे। उदाहरण के लिए, ताकि वह लॉग फ़ाइल में केवल महत्वपूर्ण संदेश लिखे, और चेतावनी और सूचना संदेशों पर डिस्क स्थान को बर्बाद न करें।

फैनआउट एक्सचेंजर हमें ऐसा अवसर नहीं देता है।

लेकिन हम एक प्रत्यक्ष एक्सचेंजर का उपयोग कर सकते हैं जो केवल उन कतारों को संदेश भेजता है जिनकी बाध्यकारी कुंजी भेजे गए संदेश (प्रकाशन के लिए दूसरा तर्क) (विधि) के मार्ग कुंजी से मेल खाती है। कार्रवाई के इस तंत्र को निम्न चित्र द्वारा चित्रित किया गया है:

छवि
( आधिकारिक खरगोश वेबसाइट से ली गई छवि )

यह तस्वीर एक्सचेंज एक्स को दिखाती हैप्रत्यक्ष प्रकार और दो कतारों में - एक नारंगी बाध्यकारी कुंजी के साथ और दूसरा दो काले और हरे रंग की बाध्यकारी कुंजियों के साथ

इस स्थापना में, नारंगी रूटिंग कुंजी के साथ संदेश पहले भेजे जाएंगे, और दूसरे को काले या हरे रंग की रूटिंग कुंजी के साथ संदेश भेजे जाएंगे। कोई अन्य संदेश छोड़ दिया जाएगा।

कई बंधन


छवि
( आधिकारिक रैबिटएमक्यू वेबसाइट से ली गई छवि )

यह एक्सचेंज को एक बाइंड की के साथ कई कतारों के साथ बांधने के लिए पूरी तरह से स्वीकार्य है। हमारे उदाहरण में, हम एक्सचेंजर्स X और Q1 कतार के बीच ब्लैक बाइंडिंग कुंजी का उपयोग करके कनेक्शन जोड़ सकते हैं इस मामले में, हमारे प्रत्यक्ष प्रकार के एक्सचेंजर एक फैनआउट प्रकार के एक्सचेंजर की तरह व्यवहार करेंगे, यह मिलान बाध्यकारी कुंजी के साथ सभी कतारों को संदेश भेजेगा। काली रूटिंग कुंजी के साथ एक संदेश Q1 और Q2 दोनों में वितरित किया जाएगा

संदेश जारी


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


$producer->newDirectExchange('my-logs');

अब हम संदेश भेज सकते हैं:


$producer->newDirectExchange('my-logs');
$producer->publish($message, $severity, 'my-logs');

चीजों को जटिल नहीं करने के लिए, मान लें कि गंभीरता ($ गंभीरता) का स्तर केवल 'जानकारी', 'चेतावनी', 'त्रुटि' हो सकता है।

अंशदान


पिछले भाग की तरह, हम दो श्रमिकों का निर्माण करेंगे जो कतारों की घोषणा करेंगे और उन्हें एक्सचेंजर के साथ निम्नानुसार जोड़ेंगे:


// Worker 1
foreach ($severities as $severity) {
   $consumer->queue('queue-1')->bind('my-logs', $severity);
}

यह सब एक साथ डालें


छवि
(छवि आधिकारिक RabbitMQ वेबसाइट से ली गई है ) send.php

कोड :


try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');

   $producer->newDirectExchange('my-logs');

   $severity = isset($argv[1]) && !empty($argv[1]) ? $argv[1] : 'info';

   $message = implode(' ', array_slice($argv, 2));
   $message = empty($message) ? "Hello World!" : $message;

   $producer->publish($message, $severity, 'my-logs');

   echo "\n Sent {$message} \n";
} catch(\Exception $e) {
   var_dump($e);
}

कोड कार्यकर्ता-1. एफपी :


try {
   $consumer = \MonsterMQ\Client\Consumer();

   $consumer->connect('127.0.0.1', 5672);
   $consumer->logIn('guest', 'guest');

   $producer->queue('queue-1')->setExclusive()->declare();

   $severities = array_slice($argv, 1);
   if (empty($severities)) {
      file_put_contents('php://stderr', "Usage: $argv[0] [info] [warning] [error]\n");
      exit(1);
   }

   foreach ($severities as $severity) {
      $producer->queue('queue-1')->bind('my-logs', $severity);
   }

   $consumer->consume('queue-1');

  echo " \n Waiting for logs. To exit press CTRL+C\n";

   $consumer->wait(function ($message, $channelNumber) use ($consumer){
      echo "\n $message \n";
   });
} catch(\Exception $e) {
   var_dump($e);
}

कार्यकर्ता 2.php कोड से अलग होगा कार्यकर्ता 1.php केवल एक्सचेंजर के साथ जुड़े और के लिए पारित कतार के नाम पर की खपत () विधि 'कतार -1' को 'कतार -2' से बदलें।

अब, यदि आप चाहते हैं कि पहला कर्मी किसी फ़ाइल में 'त्रुटि' और 'चेतावनी' स्तर के संदेश सहेजे, तो टर्मिनल में निम्न कमांड चलाएँ:

php worker-1.php warning error > logs_from_rabbit.log

और यदि आप चाहते हैं कि दूसरा कर्मचारी टर्मिनल विंडो में सभी संदेश प्रदर्शित करे, तो निम्न कार्य करें:

php worker-2.php info warning error
# => Waiting for logs. To exit press CTRL+C

और त्रुटि संदेश जारी करने के लिए निम्नलिखित लिखें:

php send.php error "Run. Run. Or it will explode."

बस इतना ही। में अगले भाग, हम एक विशेष पैटर्न के आधार पर संदेश प्राप्त करने के बारे में जानेंगे।

All Articles