পিএইচপি RabbitMQ রাউটিং মোড (সরাসরি মোড)

রাবিটএমকিউর রাউটিং মোডে, ব্যবহৃত এক্সচেঞ্জের প্রকারটি "সরাসরি"। পাবলিশ-সাবস্ক্রাইব মোড থেকে প্রধান পার্থক্য হল সরাসরি এক্সচেঞ্জ মেসেজগুলি পূর্ণভাবে মিলছে ম্যাচ হতে পারার রাউটিং প্যারামিটারস ধারণ সমূহকে কিউতে পোঁচায়। স্থাপনার জন্য আর্কিটেকচারের ছবিটা নিচে দেখানো আছে।

RabbitMQ সরাসরি মোড

লক্ষ্য: RabbitMQ তে কোন কাজের মোড ব্যবহার করা না কেন, প্রধান পার্থক্য হয়ে থাকে ব্যবহৃত এক্সচেঞ্জের প্রকার এবং রাউটিং প্যারামিটারস।

1. প্রস্তুতি টিউটোরিয়াল

দয়া করে প্রথমে নিম্নলিখিত বিষয়গুলি পড়ুন যাতে সম্পর্কিত জ্ঞান বোঝা যায়:

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
);

// মেসেজ অবজেক্ট, মেসেজের বিষয় প্যারামিটার
$msg = new AMQPMessage("hello tizi365.com");

// তৃতীয় প্যারামিটারকে দায়িত্বশীল করুন, রাউটিং প্যারামিটার
$channel->basic_publish(
    $msg, // মেসেজ অবজেক্ট
    'tizi365.direct', // এক্সচেঞ্জ নাম
    "tizi365" // রাউটিং প্যারামিটার, প্রয়োজন মত অনুসারে মন্দরি
);

echo ' [x] Sent ', $msg->getBody(), "\n";

// সম্পদ মুক্তকরণ
$channel->close();
$connection->close();

লক্ষ্য: basic_publish পদ্ধতির তৃতীয় প্যারামিটারটি একটি মুখ্য প্যারামিটার।

4. মেসেজ গ্রহণ

4.1. কিউ এবং বাইন্ড এক্সচেঞ্জ ডিফাইন করুন

কিউ মেসেজ কনসিউম করার জন্য, আপনাকে প্রথমে একটি কিউ ডিফাইন করতে হবে, এবং তারপরে কিউকে লক্ষ্য এক্সচেঞ্জে বাইন্ড করতে হবে।

// একটি অজানা কিউ ডিক্লেয়ার করুন
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, // বার্তা স্বয়ংক্রিয়ভাবে অ্যাকনলেজ করার জন্য, অর্থাৎ স্বয়ংক্রিয়ভাবে র‌্যাবিটএমকিউকে জানানো হয়েছে যে বার্তাটি সফলভাবে প্রক্রিয়া করা হয়েছে।
    false,
    false,
    $callback // বার্তা হ্যান্ডলিং ফাংশন
);

// চ্যানেলটি বন্ধ না হওয়া পর্যন্ত প্রক্রিয়াটি ব্লক করুন, প্রক্রিয়াটির বাহিরে বের হওয়ার আতংকন থেকে
while ($channel->is_open()) {
    $channel->wait();
}

// সম্পদ মুক্ত করুন
$channel->close();
$connection->close();