RabbitMQ کا Fanout موڈ ایک پیٹرن ہے جہاں پراڈیوسر کے دوارہ بھیجے گئے پیغام کو مختلف کیوز میں متعلق شدت سے کانسیومر آباد کرتے ہیں، نیچے دی گئی تشریح میں معماری خاکے دیکھایا گیا ہے۔
نوٹ: RabbitMQ کے کام کے موڈ کوئی بھی ہو، فرق صرف اس بات پر ہوتا ہے کہ کس طرح کا ایکسچینج اور روٹنگ پیرامیٹرز استعمال ہوں۔
1. مددگار ہٹ-کٹ کتابچہ
براہ کرم مندرجہ ذیل باب پڑھیں تاکہ موضوع کا تائید ہو سکے:
- RabbitMQ کے بنیادی اصول
- RabbitMQ پبلش/سبسکرائب پیٹرن
- RabbitMQ PHP تیز شروعات (لاظمی، کیونکہ آئندہ باب میں کوڈ دوہرایا نہیں جائے گا بلکہ صرف اہم کوڈ اسنیپٹس دکھایا جائے گا)
2. فینآوٹ ایکسچینج کی تعریف
چینل کی exchange_declare فنکشن کے ذریعے ایکسچینج کی تعریف کریں۔
$channel->exchange_declare(
'tizi365.fanout', // ایکسچینج کا نام، یہ منفرد ہونا چاہئے اور نقل نہیں کرنا چاہئے
'fanout', // ایکسچینج کی قسم
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.fanout', // Exchange نام، یہ منفرد ہونا چاہئے اور نقل نہیں کرنا چاہئے
'fanout', // Exchange قسم
false,
false, // کیا یہ مستقل ہونا چاہئے
false
);
// پیغام کا آبجیکٹ، میسیج کنٹینٹ کو پیرامیٹر کے طور پر
$msg = new AMQPMessage("hello tizi365.com");
$channel->basic_publish(
$msg, // پیغام آبجیکٹ
'tizi365.fanout' // Exchange نام
);
echo ' [x] Sent ', $msg->getBody(), "\n";
// وسائل کو آزاد کریں
$channel->close();
$connection->close();
4. پیغامات وصول کرنا
4.1. قیو & ایکسچینج کو بائنڈ کرنا
پیغامات کو کنسیوم کرنے کے لئے، پہلے آپ کو ایک قیو کو تعریف کرنی ہوگی اور پھر اس قیو کو ہدف ایکسچینج سے بائنڈ کرنا ہوگا۔ نیچے، ایک قیو کی تعریف کی گئی ہے اور اسے ایک مخصوص ایکسچینج سے بائنڈ کیا گیا ہے۔
// ایک قیو کا اعلان کریں، اگر قیو کا نام خالی ہے تو، ایک یونیک ID خود بخود بنایا جاتا ہے، اور اس قیو کا نام واپس دیا جاتا ہے
list($queue_name, ,) = $channel->queue_declare(
"", // قیو کا نام، دوہرانے کی اجازت نہیں ہے، اگر خالی ہے تو، ایک یونیک ID خود بخود بنایا جائے گا جس سے وہ انامی قیو بن جاتا ہے
false,
false, // آیا دوم رہائی دینی چاہئے
true,
false
);
// قیو کو مخصوص ایکسچینج سے بائنڈ کریں
$channel->queue_bind(
$queue_name, // قیو کا نام
'tizi365.fanout' // ایکسچینج کا نام
);
<?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.fanout', // ایکسچینج کا نام، یہ یونیک ہونا چاہئے اور دوہرانے کا امکان نہیں ہے
'fanout', // ایکسچینج کی قسم
false,
false, // آیا دوم رہائی دینی چاہئے
false
);
// ایک قیو کا اعلان کریں
list($queue_name, ,) = $channel->queue_declare(
"", // قیو کا نام، دوہرانے کی اجازت نہیں ہے، اگر خالی ہے تو یک یونیک ID بنایا جاتا ہے، پھر یہ ایک انانموس قیو بن جاتا ہے
false,
false, // آیا دوم رہائی دینی چاہئے
true,
false
);
// قیو کو مخصوص ایکسچینج سے بائنڈ کریں
$channel->queue_bind(
$queue_name, // قیو کا نام
'tizi365.fanout' // ایکسچینج کا نام
);
echo " [*] برادری کی پیغام کا انتظار ہے۔ باہر نکلنے کے لئے CTRL+C دبائیں\n";
// پیغام کا عمل کرنے کا تعیناتی کریں (یہاں ایک بے نام تجویدی استعمال کی گئی ہے)
$callback = function ($msg) {
// پیغام کے عمل کا منطق
echo ' [x] ', $msg->body, "\n";
};
// ایک کنسیومر بنائیں
$channel->basic_consume(
$queue_name, // قیو کا نام، جس قیو کو کنسیومر کرنا ہے
'', // کنسیومر ٹیگ، نظرانداز کریں، پھر یک یونیک ID بنایا جائے گا
false,
true, // کیا خود بخود پیغام کو اعتراف کرنا ہے، یعنی ریبٹ ایم کو بتانا کہ پیغام کامیابی سے پراسیس ہوگیا ہے
false,
false,
$callback // پیغام کا عمل کرنے کا تعیناتی کرنا
);
// اگر چینل بند نہیں ہے تو، عمل کو بلاک کرنا رکھیں تاکہ وہ باہر نہ نکل سکے
while ($channel->is_open()) {
$channel->wait();
}
// وسائل کا رہائی دینا
$channel->close();
$connection->close();