PHP RabbitMQ Routing Mode (Direct Mode)
खरीदारी मोड में RabbitMQ के रूटिंग मोड में, उपयोग की जाने वाली विनिमय की प्रकार (Exchange) "निर्देशित" होती है। प्रकाश-सब्सक्राइब मोड से मुख्य अंतर यह है कि निर्देशित विनिमय संपूर्ण रूप से मेल खाते हैं जिनकी रूटिंग पैरामीटर्स एक से एक मेल खाते हैं। यहां दिए गए चित्र में आर्किटेक्चर दिखाया गया है:
नोट: RabbitMQ में किसी भी कार्य मोड का उपयोग करने के पूरा लेकिन मैदान में अंतर में विनिमय की प्रकार और रूटिंग पैरामीटर्स में होता है।
1. पूर्व पाठ्यक्रम सूचना
कृपया जरूरी ज्ञान समझने के लिए सबसे पहले निम्नलिखित खंड पढ़ें:
- RabbitMQ मूल अवधारणाएँ
- RabbitMQ रूटिंग मोड के सिद्धांत
- PHP के साथ RabbitMQ के लिए तेज शुरू करें (आवश्यक है, क्योंकि आगामी खंड कोड को दोहराने वाला नहीं है, केवल मुख्य कोड प्रदर्शित करता है)
- PHP RabbitMQ प्रकाश-सब्सक्राइब पैटर्न खंड (आवश्यक है, क्योंकि कोड संरचना लगभग समान है, विनिमय के प्रकार और रूटिंग पैरामीटर्स को छोड़कर)
2. निर्देशित विनिमय की परिभाषा
// विनिमय स्वीकार करें
$channel->exchange_declare(
'tizi365.direct', // अद्वितीय विनिमय का नाम
'direct', // विनिमय का प्रकार
false,
false, // क्या दृढ़ता बनाए रखें
false
);
नोट: संदेश निर्माता और संदेश उपभोक्ता, दोनों विनिमय की आवश्यकता होती है।
3. संदेश भेजना
हम विनिमय को संदेश भेजते हैं, और विनिमय नियमों के आधार पर संदेश को संदेशदेने न्यूनतम छूनेगा।
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// एक RabbitMQ कनेक्शन बनाएं
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// एक चैनल बनाएं
$channel = $connection->channel();
// विनिमय स्वीकार करें
$channel->exchange_declare(
'tizi365.direct', // अद्वितीय विनिमय का नाम
'direct', // विनिमय का प्रकार
false,
false, // क्या दृढ़ता बनाए रखें
false
);
// संदेश ऑब्ज
### 4.1. कतार परिभाषित करें और बाइंड एक्सचेंज
कतार संदेश को उपभोक्ता करने के लिए, आपको पहले एक कतार को परिभाषित करना होगा, और फिर कतार को लक्षित एक्सचेंज से बाइंड करना होगा।
```php
// एक नामहीन कतार की घोषणा करें
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
// कतार को निर्दिष्ट एक्सचेंज से बाइंड करें
$channel->queue_bind(
$queue_name, // कतार का नाम
'tizi365.fanout', // एक्सचेंज का नाम
"tizi365" // बाइंड करने का रूटिंग पैरामीटर, यहां 'tizi365' बाइंड करें
);
ध्यान दें: सीधा एक्सचेंज नियमों के अनुसार, अगर संदेश भेजते समय रूटिंग पैरामीटर से जुड़ा हुआ रूटिंग पैरामीटर, जो कतार को एक्सचेंज से जोड़ने के लिए सेट किया गया हो, मेल खाया जाएगा।
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// एक रैबिटएमक्यू कनेक्शन बनाएं
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// एक चैनल बनाएं
$channel = $connection->channel();
// एक एक्सचेंज घोषित करें
$channel->exchange_declare(
'tizi365.direct', // एक्सचेंज का नाम, यह अद्वितीय होना चाहिए और दोहराया नहीं जा सकता है
'direct', // एक्सचेंज प्रकार
false,
false, // क्या यह संगीतशील है
false
);
// एक नामहीन कतार घोषित करें
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
// कतार को विशिष्ट एक्सचेंज से बाइंड करें
$channel->queue_bind(
$queue_name, // कतार का नाम
'tizi365.fanout', // एक्सचेंज का नाम
"tizi365" // बाइंडिंग रूटिंग पैरामीटर, यहां 'tizi365' बाइंड करें
);
echo " [*] संदेश का इंतजार कर रहा हूँ। बाहर निकलने के लिए CTRL+C दबाएं\n";
// संदेश को हैंडल करने के लिए फ़ंक्शन को परिभाषित करें (यहां एक नामहीन फ़ंक्शन का उपयोग किया गया है)
$callback = function ($msg) {
// संदेश का हैंडलिंग तरीका
echo ' [x] ', $msg->body, "\n";
};
// एक उपभोक्ता बनाएं
$channel->basic_consume(
$queue_name, // कतार का नाम, जिसे उपभोक्ता द्वारा उपभोग करना है
'', // उपभोक्ता टैग, ध्यान दिया जाता है, स्वत: एक अद्वितीय आईडी उत्पन्न होती है
false,
true, // क्या संदेश को स्वचालित रूप से स्वीकृति देनी है, अर्थात, स्वचालित रूप से rabbitmq को सूचित करना कि संदेश को सफलतापूर्वक प्रसंस्कृत किया गया है।
false,
false,
$callback // संदेश हैंडल करने का फ़ंक्शन
);
// प्रक्रिया को ब्लॉक करें जब तक चैनल बंद नहीं होता, प्रक्रिया को बाहर निकलने से रोकने के लिए
while ($channel->is_open()) {
$channel->wait();
}
// संसाधनों को व्यायाम देना
$channel->close();
$connection->close();