รูปแบบการเผยแพร่/สับมีขออีกชื่อว่ารูปแบบแฟนเอาท์ใน RabbitMQ สำหรับ PHP

โหมดแฟนเอาท์ใน RabbitMQ เป็นรูปแบบที่ข้อความที่ส่งโดยโปรดิวเซอร์จะถูกประมวลผลโดยผู้บริโภคหลายรายในคิวอันต่าง ๆ ตามที่แสดงในแผนภูมิสถาปัตยกรรมด้านล่าง.

RabbitMQ Work Mode

แลกเปลี่ยนแฟนเอาท์สามารถส่งข้อความไปที่คิวที่ผูกกันทั้งหมด.

หมายเหตุ: ไม่ว่าจะใช้โหมดการทำงานของ RabbitMQ แบบใด ความแตกต่างอยู่ที่ประเภทของแลกเปลี่ยนและพารามิเตอร์การเปลี่ยนเส้นทางที่ใช้.

1. บทแนะนำที่ต้องการ

โปรดอ่านบทเรียนต่อไปนี้เพื่อเข้าใจความรู้ที่เกี่ยวข้อง:

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', // ชื่อแลกเปลี่ยน ต้องไม่ซ้ำกันและไม่สามารถทำซ้ำได้
    'fanout', // ประเภทแลกเปลี่ยน
    false,
    false, // จะขั้นตอนหรือไม่
    false
);
// ออบเจกต์ข้อความ โดยใช้เนื้อหาของข้อความเป็นพารามิเตอร์
$msg = new AMQPMessage("สวัสดี tizi365.com");

$channel->basic_publish(
    $msg, // ออบเจกต์ข้อความ
    'tizi365.fanout' // ชื่อแลกเปลี่ยน
);

echo ' [x] ส่งแล้ว ', $msg->getBody(), "\n";

// ปลดทรัพยากร
$channel->close();
$connection->close();
// กำหนดคิว หากชื่อคิวว่างเปล่า ระบบจะสร้าง 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;

// สร้างการเชื่อมต่อ rabbitmq
$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, // ต้องการได้รับการยอมรับโดยอัตโนมัติหรือไม่ กล่าวคือแจ้ง rabbitmq ว่าข้อความถูกประมวลผลเรียบร้อย
    false,
    false,
    $callback // ฟังก์ชันการประมวลผลข้อความ
);

// หากช่องยังไม่ปิด ให้บล็อกเพิ่อป้องกันไม่ให้โปรเซสฉกาจออก
while ($channel->is_open()) {
    $channel->wait();
}

// คืนทรัพยากร
$channel->close();
$connection->close();