PHP RabbitMQ ワークモード
RabbitMQのワークモードでは、複数のコンシューマを同じキューからメッセージを処理するように構成することが含まれており、これによりメッセージの並行処理速度が向上します。以下の図にそのアーキテクチャが示されています:
注意: 使用されるRabbitMQのワーキングモードに関係なく、各キューは複数のコンシューマをサポートし、同じキュー内のメッセージは1つのコンシューマーのみによって処理されます。
1. 必須チュートリアル
関連する知識を理解するために、次のセクションをお読みください:
- RabbitMQの基本概念
- RabbitMQのワークモード
- PHPにおけるRabbitMQのクイックスタート (後続のセクションではコードを重複せず、重要なコードのみを表示します)
2. PHPでの複数のコンシューマの実装
PHP自体はマルチスレッディングやコルーチンなどの並行技術をサポートしていないため、通常はマルチプロセスを使用して並行処理を実現します。ここでは、マルチプロセスモードを使用してキュー内のメッセージを並行して処理する複数のコンシューマを実装します。
2.1. 手動で複数のプロセスを開始する
複数のプロセスを実装するための最も簡単な方法は、PHPコマンドを手動で複数回実行する方法です。
例:
前のセクションのコンシューマスクリプトが recv.php
であると仮定します。次のようにして、複数のシェルウィンドウを開き、コンシューマスクリプトを繰り返し実行できます:
php recv.php
php recv.php
または、同じシェルウィンドウで、スクリプトをバックグラウンドで実行できます:
php recv.php &
php recv.php &
説明: この手動方法で複数のコンシューマを実装することの欠点は、プロセスが適切に保守されず、プロセスの監視が行われないことです。プロセスがクラッシュした場合、自動的に再起動されません。
2.2. Supervisorを使用して複数のプロセスを実装する
SupervisorはLinuxオペレーティングシステムのプロセス監視プログラムで、PHPプロセスを監視できます。PHPプロセスがクラッシュした場合、自動的に再起動されます。また、プロセスの並行性を構成することができるため、複数のコンシューマの並行処理を簡単に達成できます。
ここではUbuntuを使用した例を示しますが、他のLinuxディストリビューションでも同様です。
Supervisorのインストール
sudo apt-get install supervisor
Supervisorの設定
Supervisorの設定ファイルは通常、/etc/supervisor/conf.dディレクトリにあります。このディレクトリでは、Supervisorにプロセスを監視する方法を伝えるための構成ファイルを任意の数作成できます。たとえば、コンシューマプロセスを監視するためのファイル rabbitmq-worker.conf
を作成します。
例: ファイル: rabbitmq-worker.conf
[program:rabbitmq-worker]
process_name=%(program_name)s_%(process_num)02d
command=php recv.php
autostart=true
autorestart=true
user=root
numprocs=10
redirect_stderr=true
stdout_logfile=/var/log/worker.log
パラメータの説明:
- process_name: プロセス名の定義で、任意の名前を付けることができます。ここでは、
program_name
(プロセス名) とprocess_num
(プロセス番号) の2つの変数が使用されています。 - command: 実行するコマンド。
- autostart: 自動的に起動するかどうか。
- autorestart: 自動的に再起動するかどうか。
- user: コマンドを実行するために使用するシステムアカウント。
- numprocs: 並行プロセスの数で、開始するプロセスの数を示します。
- stdout_logfile: 実行ログファイルの保存先。