RabbitMQは、AMQPに基づいて実装されたエンタープライズレベルのメッセージングシステムです。メッセージシステムとは、メッセージキューシステムです。メッセージキューは、「コンシューマープロデューサーモデル」の典型的な代表です。一方の端はメッセージキューに継続的にメッセージを書き込み、もう一方の端はキュー内のメッセージを読み取りまたはサブスクライブできます。 。
なに?消費者生産者モデル?そうです!大学オペレーティングシステム講座の「消費者・生産者モデル」で、当時この問題に悩まされていたことを覚えています。
プロジェクトでは、すぐに戻る必要のない操作や時間のかかる操作を抽出して非同期操作を行うため、この非同期処理方式によりサーバーのリクエスト時間を大幅に節約でき、システムのスループットが向上します。そして、他の対応することを行うためにサーバーに影響を与えず、サーバーリソースを独占しないでください。
たとえば、登録ユーザー向けのこのサービスは、いくつかの独立したサービス(アカウント検証、電子メール検証コード、携帯電話のSMSコードなど)に分離できます。ユーザーがデータを入力するのを待つコンシューマーとして機能します。フロントエンドデータが送信されると、それらは分解され、各サービスが配置されているURLに送信されます。分散される役割はプロデューサーと同等です。コンシューマーはデータを取得するとデータを処理できない可能性があるため、それぞれに要求バッファー(メモリバッファー)があります。この作業を行うためのフレームワークはメッセージキューと呼ばれます。
別の例:eコマースシステムの注文処理システム、従来の処理モードは次のとおりです。注文時に注文システムが在庫システムのインターフェースを呼び出すことがあるため、在庫システムがダウンしている場合、2つのシステム間に深刻な依存関係があります。その後、プロセス全体が影響を受けます。現在、ほとんどの企業の処理方法は、メッセージキューの導入、注文の発行、注文システムによる永続化処理の完了、メッセージキューへのメッセージの書き込み、ユーザーの注文の返却です。
在庫システムの場合、プル/プッシュ方式を使用して注文情報を取得し、在庫システムは注文情報に基づいて在庫操作を実行します。これにより、2つのシステム間の分離が実現されます。
在庫システムは、ご注文いただいても正常にご利用いただけません。注文が行われた後、注文システムはメッセージキューに書き込み、他の後続の操作を無視するため、通常の注文の配置には影響しません。
構造図を与える:
いくつかの概念の説明:
ブローカー:簡単に言えば、メッセージキューサーバーエンティティです。
Exchange:メッセージ交換。メッセージがどのキューにルーティングされるかを指定します。
キュー:メッセージキューキャリア。各メッセージは1つ以上のキューに入れられます。
バインディング:バインディング。その役割は、ルーティングルールに従って交換とキューをバインドすることです。
ルーティングキー:ルーティングキー、エクスチェンジはこのキーに基づいてメッセージを配信します。
vhost:仮想ホスト。複数のvhostをブローカーに設定して、異なるユーザーの権限を分離できます。
プロデューサー:メッセージプロデューサーは、メッセージを配信するプログラムです。
コンシューマー:メッセージコンシューマーは、メッセージを受信するプログラムです。
channel:メッセージチャネルクライアントの各接続では、複数のチャネルを確立でき、各チャネルはセッションタスクを表します。
メッセージキューを使用するプロセスは、おおよそ次のとおりです。
(1)クライアントはメッセージキューサーバーに接続し、チャネルを開きます。
(2)クライアントは交換を宣言し、関連するプロパティを設定します。
(3)クライアントはキューを宣言し、関連するプロパティを設定します。
(4)クライアントはルーティングキーを使用して、交換とキュー間のバインディング関係を確立します。
(5)クライアントはメッセージを交換に配信します。
交換がメッセージを受信すると、メッセージのキーと設定されているバインディングに従ってメッセージをルーティングし、1つ以上のキューにメッセージを配信します。
交換にはいくつかの種類があります。直接配信はキーに基づいています。たとえば、バインド中にバインドキーが「abc」に設定されている場合、クライアントによって送信されたメッセージは「abc」に設定されたキーにのみ配信されます。キュー。キー交換はパターンマッチングの後にトピックスイッチと呼ばれ、記号「#」は1つ以上の単語に一致し、記号「*」は正確に1つの単語に一致します。たとえば、「abc。#」は「abc.def.ghi」と一致し、「abc。*」は「abc.def」とのみ一致します。また、ブロードキャストモードを採用するファンアウトスイッチと呼ばれるキーレススイッチもあり、メッセージが着信すると、スイッチにバインドされているすべてのキューに配信されます。
RabbitMQはメッセージの永続性をサポートします。つまり、データはディスクに書き込まれますデータのセキュリティのために、ほとんどのユーザーは永続性を選択すると思います。メッセージキューの永続性には3つの部分があります。
(1)交換の永続性、宣言時に
永続性=> 1を指定(2)キューの永続性、宣言時に永続性=> 1を指定
(3)メッセージの永続性、配信時に指定delivery_mode => 2(1は非永続的)
交換とキューの両方が永続的である場合、それらの間のバインディングも永続的です。交換とキューの間に永続性があり、非永続的である場合、バインディングを確立することはできません。
さて、RabbitMQの基本的なアプリケーションシナリオと利点について説明した後、Windowsプラットフォームで練習してみましょう。RabbitMQをもっと直感的に見てみましょう。
次に、RabbitMQ + PHP環境をインストールします。
1. RabbitMQをインストールします
RabbitMQをインストールする前に、まずErlang言語開発キットをインストールする必要があります。ダウンロードアドレス:http://www.erlang.org/download/otp_win32_R15B.exe
環境変数ERLANG_HOME C:\ Program Files(x86)\ erl5.9を構成します。
PATH%ERLANG_HOME%\ binに追加します。
RabbitMQをダウンロードしてインストールします。ダウンロードアドレス:http://www.rabbitmq.com/releases/rabbitmq-server/v3.3.4/rabbitmq-server-3.3.4.exe
環境変数Cを構成します。\ Program Files(x86)\ RabbitMQ Server \ rabbitmq_server-2.8.0
PATH%RABBITMQ_SERVER%\ sbinに追加します。
次に、dosでRabbitMQディレクトリに切り替え、rabbitmq-plugins.bat enable rabbitmq_managementを実行し、インストールが完了したら、管理者としてrabbitmqを起動します。次のコマンドを入力します。
rabbitmq-service.bat stop
rabbitmq-service.batインストール
rabbitmq-service.bat start
次に、ブラウザーに127.0.0.1:15672と入力します。ユーザー名とパスワードはguestです。ログインできれば、インストールは成功しています。
2.次に、php amqp拡張機能をインストールします。
まず、()を表示PHPのバージョン情報のphpinfo、および、情報
最後に、上記の情報に従って対応するamqpバージョンをダウンロードします。http://pecl.php.net/package/amqp
上記の情報によると、私たちは32ビットの非スレッドセーフバージョンです
加圧後:
php_amqp.dllをphp / extにコピーし、次のコードをphp.iniに追加します。
[amqp]
extension = php_amqp.dll
次に、rabbitmq.1.dllをphpルートディレクトリC:/ xampp / php /にコピーし、Apache設定ファイルhttpd.confを変更して、次のコードを追加します
#rabbitmq
LoadFile "C:/xampp/php/rabbitmq.1.dll"
最後に再起動して、amqpモジュールがロードされているかどうかを確認します。
---------------------------------ここまでで、インストールは終了です---------- ---------------------------------------
RabbitMQ + PHPの表示例
コンシューマーとしての新しいrabbit_consumer.php
<?php
//配置信息
$conn_args = array(
'host' => '127.0.0.1',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
$e_name = 'e_linvo'; //交换机名
$q_name = 'q_linvo'; //队列名
$k_route = 'key_1'; //路由key
//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);
//创建交换机
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
$ex->setType(AMQP_EX_TYPE_DIRECT); //direct类型
$ex->setFlags(AMQP_DURABLE); //持久化
echo "Exchange Status:".$ex->declare()."\n";
//创建队列
$q = new AMQPQueue($channel);
$q->setName($q_name);
$q->setFlags(AMQP_DURABLE); //持久化
echo "Message Total:".$q->declare()."\n";
//绑定交换机与队列,并指定路由键
echo 'Queue Bind: '.$q->bind($e_name, $k_route)."\n";
//阻塞模式接收消息
echo "Message:\n";
while(True){
$q->consume('processMessage');
//$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答
}
$conn->disconnect();
/**
* 消费回调函数
* 处理消息
*/
function processMessage($envelope, $queue) {
$msg = $envelope->getBody();
echo $msg."\n"; //处理消息
$queue->ack($envelope->getDeliveryTag()); //手动发送ACK应答
}
?>
プロデューサーとしてrabbit_publisher.phpを作成します
<?php
//配置信息
$conn_args = array(
'host' => '127.0.0.1',
'port' => '5672',
'login' => 'guest',
'password' => 'guest',
'vhost'=>'/'
);
$e_name = 'e_linvo'; //交换机名
//$q_name = 'q_linvo'; //无需队列名
$k_route = 'key_1'; //路由key
//创建连接和channel
$conn = new AMQPConnection($conn_args);
if (!$conn->connect()) {
die("Cannot connect to the broker!\n");
}
$channel = new AMQPChannel($conn);
//创建交换机对象
$ex = new AMQPExchange($channel);
$ex->setName($e_name);
date_default_timezone_set("Asia/Shanghai");
//发送消息
//$channel->startTransaction(); //开始事务
for($i=0; $i<5; ++$i){
sleep(1);//休眠1秒
//消息内容
$message = "TEST MESSAGE!".date("h:i:sa");
echo "Send Message:".$ex->publish($message, $k_route)."\n";
}
//$channel->commitTransaction(); //提交事务
$conn->disconnect();
?>
テストする:
ウィンドウを起動してphpディレクトリに切り替え、次のように入力します。php c:/xampp/htdocs/RabbitMQ/rabbit_consumer.php
実行中の消費者
次に、DOSウィンドウを開き、phpルートディレクトリに切り替えて、次のコマンドを入力します。php c:/xampp/htdocs/RabbitMQ/rabbit_publisher.php
実行中のプロデューサー
消費者がメッセージを受け取る
これは、RabbitMQキューによるメッセージの処理をシミュレートします。
これが公式ウェブサイトのphp使用ガイドです:http://www.rabbitmq.com/tutorials/tutorial-one-php.html