Rumah  >  Artikel  >  rangka kerja php  >  Penyepaduan praktikal Swoole dan RabbitMQ: meningkatkan prestasi pemprosesan baris gilir mesej

Penyepaduan praktikal Swoole dan RabbitMQ: meningkatkan prestasi pemprosesan baris gilir mesej

王林
王林asal
2023-06-15 09:45:241176semak imbas

Dengan perkembangan berterusan perniagaan Internet, baris gilir mesej telah menjadi bahagian yang amat diperlukan dalam banyak sistem. Dalam penggunaan sebenar, prestasi baris gilir mesej tradisional tidak sesuai di bawah keadaan konkurensi tinggi dan daya pemprosesan yang tinggi. Dalam beberapa tahun kebelakangan ini, Swoole dan RabbitMQ telah menjadi dua teknologi yang telah menarik banyak perhatian. Penyepaduan mereka boleh memberikan jaminan yang lebih baik untuk prestasi pemprosesan baris gilir mesej.

Artikel ini akan memperkenalkan prinsip asas Swoole dan RabbitMQ, dan digabungkan dengan kes sebenar, meneroka cara menggunakan penyepaduan mereka untuk meningkatkan prestasi pemprosesan baris gilir mesej.

1. Pengenalan kepada Swoole

Swoole ialah sambungan PHP yang ditulis dalam bahasa C++ Ia menyediakan satu siri alatan dan API yang berkuasa, membolehkan PHP melaksanakan pengaturcaraan tak segerak seperti Node.js. Selain menyediakan I/O asynchronous, coroutine, concurrency tinggi dan ciri-ciri lain, Swoole juga menyediakan banyak fungsi yang berkaitan dengan pengaturcaraan rangkaian, seperti pengkapsulan protokol TCP/UDP, pelayan HTTP, pelayan WebSocket, dsb.

Ciri utama Swoole termasuk:

  1. Gunakan IO tak segerak + mod berbilang proses untuk meningkatkan prestasi konkurensi
  2. Sediakan ciri pengaturcaraan coroutine untuk mengelakkan beberapa masalah berbilang -threading
  3. Serasi dengan program PHP tradisional, menyediakan API melalui sambungan swoole
  4. Sokongan merentas platform, sesuai untuk Linux, Windows dan platform lain

2 kepada RabbitMQ

RabbitMQ ialah baris gilir mesej sumber terbuka yang mencapai prestasi tinggi, kebolehpercayaan tinggi, kebolehskalaan dan ciri lain, dan digunakan secara meluas dalam sistem teragih. RabbitMQ adalah berdasarkan protokol AMQP dan melaksanakan pengedaran mesej melalui gabungan baris gilir dan suis.

Ciri utama RabbitMQ termasuk:

  1. Ketersediaan tinggi, sokongan untuk baris gilir cermin dan penyegerakan data antara nod
  2. Kebolehpercayaan, menyediakan berbilang mod penghantaran mesej, seperti Mekanisme pengesahan ACK dan mekanisme kegigihan
  3. Fleksibiliti, menyokong berbilang bahasa dan protokol, seperti AMQP, STOMP, MQTT, dsb.
  4. Skalabiliti, menyokong penyebaran nod yang diedarkan

3. Sepadukan dengan menggabungkan Swoole dan RabbitMQ

Idea utama untuk mengintegrasikan Swoole dan RabbitMQ ialah menggunakan klien RabbitMQ dalam pelayan Swoole untuk menyambung ke pelayan RabbitMQ, dan kemudian menggunakan asynchronous IO dan ciri coroutine yang disediakan oleh Swoole , untuk mencapai keselarasan tinggi dan pemprosesan pemprosesan baris gilir mesej yang tinggi.

Berikut ialah contoh kod mudah untuk menyambung ke pelayan RabbitMQ, mencipta suis dan baris gilir, menghantar dan menerima mesej dalam pelayan Swoole.

// 连接RabbitMQ服务器
$client = new PhpAmqpLibConnectionAMQPStreamConnection($host, $port, $username, $password, $vhost);

// 创建一个通道
$channel = $client->channel();

// 定义交换机和队列
$channel->exchange_declare($exchange, 'direct', false, true, false);
$channel->queue_declare($queue, false, true, false, false);
$channel->queue_bind($queue, $exchange);

// 发送消息
$msg = new PhpAmqpLibMessageAMQPMessage('hello world');
$channel->basic_publish($msg, $exchange);

// 接收消息
$callback = function ($msg) {
    echo $msg->body;
};
$channel->basic_consume($queue, '', false, true, false, false, $callback);

// 运行事件循环
while (count($channel->callbacks)) {
    $channel->wait();
}

Dalam penggunaan sebenar, kami biasanya mencipta proses Swoole Worker khusus untuk memproses baris gilir mesej, dan memulakannya melalui kaedah proses yang disediakan oleh Swoole. Berikut ialah kod sampel yang dipermudahkan:

$worker = new SwooleProcess(function () {
    // 连接RabbitMQ服务器
    $client = new PhpAmqpLibConnectionAMQPStreamConnection($host, $port, $username, $password, $vhost);
    $channel = $client->channel();
    $channel->exchange_declare($exchange, 'direct', false, true, false);
    $channel->queue_declare($queue, false, true, false, false);
    $channel->queue_bind($queue, $exchange);

    // 接收消息
    $callback = function ($msg) {
        // 处理消息
        echo $msg->body;
    };
    $channel->basic_consume($queue, '', false, true, false, false, $callback);

    while (true) {
        $channel->wait();
    }
});

$worker->start();

4 Penyepaduan praktikal Swoole dan RabbitMQ

Dalam aplikasi praktikal, kami boleh menggunakannya pada pemprosesan baris gilir mesej, seperti tugas pemprosesan tak segerak, dsb. Berikut ialah contoh mudah untuk memproses tugas penskalaan imej secara tak segerak.

// 连接RabbitMQ服务器
$client = new PhpAmqpLibConnectionAMQPStreamConnection($host, $port, $username, $password, $vhost);
$channel = $client->channel();
$channel->exchange_declare($exchange, 'direct', false, true, false);
$channel->queue_declare($queue, false, true, false, false);
$channel->queue_bind($queue, $exchange);

// 发送消息
$msg = new PhpAmqpLibMessageAMQPMessage(json_encode(['image_url' => 'http://example.com/image.jpg', 'size' => [200, 200]]));
$channel->basic_publish($msg, $exchange);

// 创建Swoole Worker进程
$worker = new SwooleProcess(function () use ($channel, $queue) {
    // 连接RabbitMQ服务器
    $client = new PhpAmqpLibConnectionAMQPStreamConnection($host, $port, $username, $password, $vhost);
    $channel = $client->channel();
    $channel->queue_declare($queue . '_result', false, true, false, false);

    // 接收消息
    $callback = function ($msg) use ($channel) {
        // 处理消息
        $data = json_decode($msg->body, true);
        $image = file_get_contents($data['image_url']);
        $image = imagecreatefromstring($image);
        $size = $data['size'];
        $width = imagesx($image);
        $height = imagesy($image);
        $new_image = imagecreatetruecolor($size[0], $size[1]);
        imagecopyresized($new_image, $image, 0, 0, 0, 0, $size[0], $size[1], $width, $height);
        ob_start();
        imagejpeg($new_image);
        $result = ob_get_clean();

        // 发送结果
        $msg = new PhpAmqpLibMessageAMQPMessage($result);
        $channel->basic_publish($msg, '', $queue . '_result');
        $channel->basic_ack($msg->delivery_info['delivery_tag']);
    };
    $channel->basic_consume($queue, '', false, false, false, false, $callback);

    // 运行事件循环
    while (true) {
        $channel->wait();
    }
});

$worker->start();

Dalam kod contoh di atas, kami mula-mula menghantar mesej format JSON ke proses utama, termasuk URL dan saiz imej yang diperlukan untuk diproses. Kami kemudiannya mencipta proses Swoole Worker untuk memproses mesej dan disambungkan ke baris gilir melalui klien RabbitMQ. Dalam proses itu, kami mentakrifkan fungsi panggil balik pemprosesan dan mendengar mesej baris gilir melalui kaedah basic_consume. Apabila menerima mesej, kami menghuraikan mesej dalam format JSON, mendapatkan imej dan saiz dan memprosesnya, dan kemudian menghantar hasilnya ke baris gilir lain melalui kaedah basic_publish Selepas penghantaran selesai, kami mengesahkan penyiapan pemprosesan mesej kaedah basic_ack.

Dengan cara ini, kami boleh menggunakan Swoole dan RabbitMQ dengan mudah untuk melaksanakan pemprosesan baris gilir mesej berprestasi tinggi, dengan itu mengoptimumkan prestasi keseluruhan sistem.

5. Ringkasan

Artikel ini memperkenalkan prinsip asas Swoole dan RabbitMQ, dan menggabungkan kes praktikal untuk meneroka cara menggunakan penyepaduan mereka untuk mencapai pemprosesan baris gilir mesej berprestasi tinggi. Dalam penggunaan sebenar, kita harus mengoptimumkan mengikut senario tertentu, seperti membahagikan tugas dengan munasabah, menggunakan cache, dsb., untuk menjadikan prestasi keseluruhan sistem lebih baik.

Atas ialah kandungan terperinci Penyepaduan praktikal Swoole dan RabbitMQ: meningkatkan prestasi pemprosesan baris gilir mesej. 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