インターネット ビジネスの継続的な発展に伴い、メッセージ キューは多くのシステムにとって不可欠な部分になりました。実際の使用において、従来のメッセージ キューのパフォーマンスは、高い同時実行性と高いスループットの条件下では理想的ではありません。近年、SwooleとRabbitMQが注目を集めており、これらを統合することでメッセージキューの処理性能をより保証することができます。
この記事では、Swoole と RabbitMQ の基本原理を紹介し、実際のケースと組み合わせて、それらの統合を使用してメッセージ キューの処理パフォーマンスを向上させる方法を検討します。
1. Swoole の概要
Swoole は C 言語で書かれた PHP 拡張機能であり、一連の強力なツールと API を提供し、PHP が Node.js のような非同期プログラミングを実行できるようにします。 Swoole は、非同期 I/O、コルーチン、高同時実行性などの機能を提供することに加えて、TCP/UDP プロトコルのカプセル化、HTTP サーバー、WebSocket サーバーなど、ネットワーク プログラミングに関連する多くの機能も提供します。
Swoole の主な機能は次のとおりです。
2. 概要RabbitMQ
RabbitMQ は、高性能、高信頼性、拡張性などを実現したオープンソースのメッセージキューであり、分散システムで広く使用されています。 RabbitMQ は AMQP プロトコルに基づいており、キューとスイッチの組み合わせを通じてメッセージ配信を実装します。
RabbitMQ の主な機能は次のとおりです。
// 连接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(); }
$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();
// 连接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();
以上がSwoole と RabbitMQ の実用的な統合: メッセージ キューの処理パフォーマンスの向上の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。