وضع التوجيه PHP RabbitMQ (الوضع المباشر)

في وضع التوجيه الخاص بـ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("مرحبًا tizi365.com");

// انتبه إلى المعلمة الثالثة، معلمة التوجيه
$channel->basic_publish(
    $msg, // كائن الرسالة
    'tizi365.direct', // اسم التبادل
    "tizi365" // معلمة التوجيه، يمكن تعريفها بشكل تعسفي حسب الحاجة
);

echo ' [x] تم الإرسال ', $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();