AMQPを実装し、プログラム間のメッセージのやりとりを仲介するRabbitMQの御紹介です。
AMQPって何もの??
AMQP
Advanced Message Queuing Protocolの略であり、ビジネスメッセージをアプリケーションや組織間で伝達するための公開規格です。
公式サイトによると、元々は金融機関向けに開発されたようで、バンク・オブ・アメリカ、JPMorgan、ドイツ銀行など欧米有力銀行で利用されているようです。
主な機能としては、異なる組織・異なるプラットフォーム・異なる時間(非同期処理)・異なる場所(離れている場所やネットワーク環境)でも、繋げることができる点に強みがあります。
RabbitMQの嬉しい機能
- Queueの前にExchange機能が特長で、ルーティング、ロードバランス、ファンアウトを利用できます。
- 非同期処理
- クラスタ化で耐障害性
Exchangeが特長です。
ソシャゲとRabbitMQ
課金と分割されたDBへの平行処理に使っている例がとても詳しいですね!
導入しましょう
EPELのインストール
1 |
# yum install epel-release |
1 |
# sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo |
RabbitMQのインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# yum --enablerepo=epel install rabbitmq-server インストール: rabbitmq-server.noarch 0:3.3.5-34.el7 依存性関連をインストールしました: erlang-asn1.x86_64 0:R16B-03.18.el7 erlang-compiler.x86_64 0:R16B-03.18.el7 erlang-crypto.x86_64 0:R16B-03.18.el7 erlang-erts.x86_64 0:R16B-03.18.el7 erlang-hipe.x86_64 0:R16B-03.18.el7 erlang-inets.x86_64 0:R16B-03.18.el7 erlang-kernel.x86_64 0:R16B-03.18.el7 erlang-mnesia.x86_64 0:R16B-03.18.el7 erlang-os_mon.x86_64 0:R16B-03.18.el7 erlang-otp_mibs.x86_64 0:R16B-03.18.el7 erlang-public_key.x86_64 0:R16B-03.18.el7 erlang-runtime_tools.x86_64 0:R16B-03.18.el7 erlang-sasl.x86_64 0:R16B-03.18.el7 erlang-sd_notify.x86_64 0:0.1-1.el7 erlang-snmp.x86_64 0:R16B-03.18.el7 erlang-ssl.x86_64 0:R16B-03.18.el7 erlang-stdlib.x86_64 0:R16B-03.18.el7 erlang-syntax_tools.x86_64 0:R16B-03.18.el7 erlang-tools.x86_64 0:R16B-03.18.el7 erlang-xmerl.x86_64 0:R16B-03.18.el7 lksctp-tools.x86_64 0:1.0.17-2.el7 |
ファイアウォール設定
1 |
# firewall-cmd --add-port=5672/tcp --permanent |
1 |
# firewall-cmd --reload |
RabbitMQの起動
1 |
# systemctl start rabbitmq-server |
1 |
# systemctl enable rabbitmq-server |
ユーザの作成
1 2 3 4 |
# rabbitmqctl add_user rabbituser password Creating user "rabbituser" ... ...done. |
ユーザリストの表示
1 2 3 4 5 6 |
# rabbitmqctl list_users Listing users ... guest [administrator] rabbituser [] ...done. |
ホスト設定
1 2 3 4 |
# rabbitmqctl add_vhost /my_vhost Creating vhost "/my_vhost" ... ...done. |
ホストリスト
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# rabbitmqctl list_vhosts Listing vhosts ... / /my_vhost ...done. ------------------------------------------------- ※ vhostを削除する場合は以下 # rabbitmqctl delete_vhost /my_vhost ------------------------------------------------- |
パーミッション設定
1 2 3 4 5 |
rabbitmqctl set_permissions [-p vhost] [ユーザー] [パーミッション ⇒ (変更) (書き込み) (読み込み) の順] # rabbitmqctl set_permissions -p /my_vhost rabbituser ".*" ".*" ".*" Setting permissions for user "rabbituser" in vhost "/my_vhost" ... ...done. |
※管理者権限付与する場合
1 2 3 |
# rabbitmqctl set_user_tags rabbituser administrator Setting tags for user "rabbituser" to [administrator] ... ...done. |
1 2 3 4 5 |
# rabbitmqctl list_permissions -p /my_vhost Listing permissions in vhost "/my_vhost" ... rabbituser .* .* .* ...done. |
1 2 3 4 5 |
# rabbitmqctl list_user_permissions rabbituser Listing permissions for user "rabbituser" ... /my_vhost .* .* .* ...done. |
パーミッションを削除する場合
1 |
# rabbitmqctl clear_permissions -p /my_vhost rabbituser |
RabbitMQ : PHP から利用する
1 |
# yum --enablerepo=epel install composer php-bcmath |
1 |
# useradd yuu |
1 |
# su yuu |
1 |
$ cd |
1 2 |
$ pwd /home/yuu |
1 2 3 4 5 6 7 8 9 10 |
[yuu@localhost ~]$ composer require php-amqplib/php-amqplib Using version ^2.6 for php-amqplib/php-amqplib ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing php-amqplib/php-amqplib (v2.6.3): Downloading (100%) Writing lock file Generating autoload files |
1 2 3 4 5 |
[yuu@localhost ~]$ composer install Loading composer repositories with package information Installing dependencies (including require-dev) from lock file Nothing to install or update Generating autoload files |
受信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ vi receive_msg.php <?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; $connection = new AMQPStreamConnection('127.0.0.1', 5672, 'rabbituser', 'password', '/my_vhost'); $channel = $connection->channel(); $channel->queue_declare('Hello_RABBIT', false, false, false, false); echo ' [*] Waiting for messages. To exit press CTRL+C', "\n"; $callback = function($msg) { echo " [x] Received ", $msg->body, "\n"; }; $channel->basic_consume('Hello_RABBIT', '', false, true, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); } ?> |
送信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ vi send_msg.php <?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; $connection = new AMQPStreamConnection('127.0.0.1', 5672, 'rabbituser', 'password', '/my_vhost'); $channel = $connection->channel(); $channel->queue_declare('Hello_RABBIT', false, false, false, false); $msg = new AMQPMessage('Hello RabbitMQ!'); $channel->basic_publish($msg, '', 'Hello_RABBIT'); echo " [x] Sent 'Hello RabbitMQ!'\n"; $channel->close(); $connection->close(); ?> |
1 2 |
$ php send_msg.php [x] Sent 'Hello RabbitMQ!' |
実際にメッセージを送ってみよう
左が受信側で、右が送信側のコンソール。メッセージを送信します。
右のコンソールからPHPスクリプトで送信を行うと、左のコンソールにメッセージが届きました。受信が出来たことがわかります。
管理画面の導入
1 |
# rabbitmq-plugins enable rabbitmq_management |
ファイアウォール設定
1 |
# systemctl restart rabbitmq-server |
1 |
# firewall-cmd --add-port=15672/tcp --permanent |
1 |
# firewall-cmd --reload |
http://サーバIPアドレス:15672
管理権限を与えたユーザでログインが可能です。
実際にRabbitMQを利用する際は冗長化を行って下さいね。
お疲れ様です。