PHP RabbitMQ ワークモード

RabbitMQのワークモードでは、複数のコンシューマを同じキューからメッセージを処理するように構成することが含まれており、これによりメッセージの並行処理速度が向上します。以下の図にそのアーキテクチャが示されています:

RabbitMQ ワークモード

注意: 使用されるRabbitMQのワーキングモードに関係なく、各キューは複数のコンシューマをサポートし、同じキュー内のメッセージは1つのコンシューマーのみによって処理されます。

1. 必須チュートリアル

関連する知識を理解するために、次のセクションをお読みください:

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: 実行ログファイルの保存先。