Rumah  >  Artikel  >  rangka kerja php  >  Amalan penyepaduan Swoole dan RabbitMQ: membina sistem baris gilir mesej ketersediaan tinggi

Amalan penyepaduan Swoole dan RabbitMQ: membina sistem baris gilir mesej ketersediaan tinggi

WBOY
WBOYasal
2023-06-14 12:56:091366semak imbas

Dengan kemunculan era Internet, sistem baris gilir mesej menjadi semakin penting. Ia membolehkan operasi tak segerak antara aplikasi yang berbeza, mengurangkan gandingan dan meningkatkan kebolehskalaan, dengan itu meningkatkan prestasi dan pengalaman pengguna keseluruhan sistem. Dalam sistem baris gilir mesej, RabbitMQ ialah perisian beratur mesej sumber terbuka yang berkuasa Ia menyokong pelbagai protokol mesej dan digunakan secara meluas dalam transaksi kewangan, e-dagang, permainan dalam talian dan bidang lain.

Dalam aplikasi praktikal, selalunya diperlukan untuk mengintegrasikan RabbitMQ dengan sistem lain. Artikel ini akan memperkenalkan cara menggunakan sambungan swool untuk melaksanakan gugusan RabbitMQ yang tersedia tinggi dan menyediakan kod sampel yang lengkap.

1. Penyepaduan RabbitMQ

  1. Pengenalan kepada RabbitMQ

RabbitMQ ialah perisian baris gilir mesej merentas platform yang mematuhi sepenuhnya protokol AMQP ( Protokol Beratur Mesej Lanjutan) dan menyokong berbilang protokol mesej. Idea teras RabbitMQ adalah untuk meletakkan mesej ke dalam baris gilir dan mengeluarkannya apabila diperlukan, mencapai pertukaran data tak segerak dan komunikasi yang cekap.

  1. Integrasi RabbitMQ

Untuk mengintegrasikan RabbitMQ dengan aplikasi PHP, kami boleh menggunakan API yang disediakan oleh perpustakaan PHP AMQP. Perpustakaan ini menyokong protokol dan sambungan AMQP 0-9-1 utama RabbitMQ, termasuk Terbitkan, Langgan, Baris Gilir, Pertukaran dan fungsi lain. Berikut ialah kod contoh mudah:

<?php
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

// 建立连接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明队列
$channel->queue_declare('hello', false, false, false, false);

// 创建消息
$msg = new AMQPMessage('Hello World!');

// 发送消息
$channel->basic_publish($msg, '', 'hello');

echo " [x] Sent 'Hello World!'
";

// 关闭连接
$channel->close();
$connection->close();
?>

Kod contoh ini bersambung ke pelayan RabbitMQ setempat ('localhost'), mengisytiharkan baris gilir bernama 'hello' dan menghantar mesej ke baris gilir ini.

2. Penyepaduan Swoole

  1. Pengenalan Swoole

Swoole ialah rangka kerja komunikasi rangkaian tak segerak PHP berprestasi tinggi yang melaksanakan TCP dan UDP tak segerak , HTTP, WebSocket dan protokol komunikasi lain. Ia dicirikan oleh konkurensi tinggi, prestasi tinggi, penggunaan rendah, dan pembangunan mudah Ia telah digunakan secara meluas dalam senario seperti perkhidmatan web dan pelayan permainan.

  1. Swoole menyepadukan RabbitMQ

Ciri tak segerak Swoole sangat serasi dengan komunikasi tak segerak RabbitMQ, dan boleh mencapai sistem baris gilir mesej yang cekap, stabil dan kependaman rendah. Berikut ialah contoh kod untuk Swoole mengintegrasikan RabbitMQ:

<?php
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

// 建立连接
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明队列
$channel->queue_declare('task_queue', false, true, false, false);

echo " [*] Waiting for messages. To exit press CTRL+C
";

// 接收消息
$callback = function ($msg) {
    echo ' [x] Received ', $msg->body, "
";
    sleep(substr_count($msg->body, '.'));
    echo " [x] Done
";
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);

// 监听消息
while (count($channel->callbacks)) {
    $channel->wait();
}

// 关闭连接
$channel->close();
$connection->close();
?>

Kod sampel ini bersambung ke pelayan RabbitMQ setempat ('localhost'), mengisytiharkan baris gilir berterusan 'task_queue' dan mula mendengar mesej baris gilir. Apabila mesej tiba, Swoole akan memanggil fungsi panggil balik secara tak segerak, dan boleh menghantar respons selepas memproses logik perniagaan dalam fungsi panggil balik untuk mencapai komunikasi tak segerak kependaman rendah yang cekap.

3. Seni bina ketersediaan tinggi

Untuk mencapai sistem baris gilir mesej ketersediaan tinggi, kami perlu menyepadukan berbilang nod RabbitMQ dalam kelompok untuk meningkatkan kebolehskalaan dan toleransi kesalahan sistem .

Konfigurasi kelompok RabbitMQ yang biasa digunakan termasuk mod siap sedia aktif dan mod pencerminan. Dalam mod siap sedia aktif, satu nod berfungsi sebagai nod aktif dan nod lain berfungsi sebagai nod sandaran. Apabila nod utama turun, nod sandaran secara automatik mengambil alih tanggungjawabnya. Dalam mod cermin, baris gilir direplikasi ke cakera pada berbilang nod dan disegerakkan. Setiap nod ini boleh mengendalikan mesej yang dihantar oleh pengeluar dan permintaan pengguna.

Memandangkan kestabilan, kebolehskalaan, kebolehselenggaraan dan faktor lain, kami memilih mod cermin sebagai seni bina ketersediaan tinggi kami. Berikut ialah kod contoh untuk menambah baris gilir cermin dalam fail konfigurasi:

$channel->queue_declare('task_queue', false, true, false, false, false, array(
    'x-ha-policy' => array('S', 'all'),
    'x-dead-letter-exchange' => array('S', 'dead_exchange'),
));

Kod sampel ini mencipta baris gilir berterusan bernama 'task_queue' dan menetapkan parameter 'x-ha-policy' kepada 'semua' , menunjukkan bahawa semua baris gilir cermin baris gilir ini adalah "sangat tersedia". Pada masa yang sama, parameter 'x-dead-letter-exchange' juga ditetapkan kepada 'dead_exchange', yang bermaksud bahawa mesej akan dihantar ke suis ini selepas ditolak. Suis ini boleh mempunyai satu atau lebih baris gilir terikat untuk penggunaan semula mesej atau statistik.

4. Kod sampel lengkap

Berikut ialah kod contoh sistem baris gilir mesej yang lengkap, yang menggunakan rangka kerja komunikasi tak segerak Swoole untuk menyepadukan mod giliran cermin RabbitMQ untuk mencapai baris gilir mesej ketersediaan tinggi sistem. Anda boleh mengubah suai konfigurasi atau kod untuk melaksanakan sistem baris gilir mesej anda sendiri mengikut keperluan sebenar.

<?php
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

$exchangeName = 'test.exchange';
$queueName = 'test.queue';
$deadExchangeName = 'dead.exchange';

// 建立连接
$connection = new AMQPStreamConnection(
    'localhost', 5672, 'guest', 'guest', '/', false, 'AMQPLAIN', null, 'en_US', 3.0, 3.0, null, true
);
$channel = $connection->channel();

// 声明交换机
$channel->exchange_declare($exchangeName, 'direct', false, true, false);

// 声明死信交换机
$channel->exchange_declare($deadExchangeName, 'fanout', false, true, false);

// 声明队列
$channel->queue_declare($queueName, false, true, false, false, false, array(
    'x-ha-policy' => array('S', 'all'),
    'x-dead-letter-exchange' => array('S', $deadExchangeName),
));

// 绑定队列到交换机中
$channel->queue_bind($queueName, $exchangeName);

echo " [*] Waiting for messages. To exit press CTRL+C
";

// 接收消息
$callback = function ($msg) {
    echo ' [x] Received ', $msg->body, "
";
    sleep(substr_count($msg->body, '.'));
    echo " [x] Done
";
    $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume($queueName, '', false, false, false, false, $callback);

// 监听消息
while (count($channel->callbacks)) {
    $channel->wait();
}

// 关闭连接
$channel->close();
$connection->close();
?>

Dalam kod di atas, sambungan kepada RabbitMQ mula-mula diwujudkan melalui kelas AMQPStreamConnection. Kemudian buat suis bernama 'test.exchange', baris gilir bernama 'test.queue' dan tetapkan 'x-ha-policy' kepada 'semua', menunjukkan bahawa baris gilir ini ialah baris gilir cermin dan semua nod boleh mengakses. Pada masa yang sama, 'x-dead-letter-exchange' juga ditetapkan kepada 'dead.exchange', yang bermaksud bahawa mesej akan dihantar ke suis 'dead.exchange' selepas ditolak.

Akhir sekali, dalam fungsi panggil balik, gunakan kaedah basic_ack() untuk menentukan kejayaan penggunaan dan lepaskan sumber yang diduduki oleh mesej.

Di atas adalah kandungan yang berkaitan tentang amalan penyepaduan Swoole dan RabbitMQ. Dengan menggunakan sambungan Swoole, kami boleh melaksanakan komunikasi tak segerak dengan mudah dan menyepadukan berbilang nod RabbitMQ ke dalam sistem baris gilir mesej ketersediaan tinggi untuk meningkatkan prestasi dan kestabilan sistem.

Atas ialah kandungan terperinci Amalan penyepaduan Swoole dan RabbitMQ: membina sistem baris gilir mesej ketersediaan tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn