わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

11日目: RabbitMQことはじめ

以下の本文は本当は今年の初めくらいにはもう書いてた気がする。公開するのを忘れていた。
インストールは以下の記事を参考にされたし。


PHPでRabbitMQを使った経験が既にあるが
RabbitMQ - RabbitMQ tutorial - "Hello World!"
の部分訳を書いて、RabbitMQがどんなもんなのかを紹介する。

専門用語自体は訳すのではなく斜体にした。

言葉の説明(Introductionの部分意訳)

RabbitMQ

RabbitMQはメッセージのブローカーである。producerからのメッセージを受け付け、consumerにメッセージを運ぶ。間に立って指定したルールに従って、メッセージを適切なところに渡したり、一時保管しておいたり、保存してとっておいたりしてくれる。

Producer

producingというのはメッセージを送るという意味だ。メッセージを送るプログラムのことをproducerと呼ぶ。"P"であらわす。

Queue

queueはメッセージボックスのことである。RabbitMQの中にある。RabbitMQやアプリケーションを通してメッセージは流れていくが、保存できるのはqueueだけである。queueに制限はなく好きなだけメッセージを保存できる。多くのproducerから一つのqueueにメッセージを送ることができ、多くのconsumerが一つのqueueからデータを受け取ることができる。

Consumer

consumingはデータの受信と似た意味である。consumerはメッセージを受け取るために待機しているプログラムである。"C"であらわす。

ちなみにproducerconsumer、RabbitMQ本体は同じマシン上にある必要はない。実際ほとんどのアプリケーションで同じマシン上にはない。

RabbitMQの設定

実際に私が利用したことのあるPHPのAMQPライブラリはpeclのamqpだが、ここは雰囲気だけを見るものとしてコードは省略し"Hello World"の章を訳しつつ説明する。

メッセージの送信

メッセージの送信側をsend.php、受信側をreceive.phpとする。send.phpはRabbitMQに接続し、メッセージを一個送ると終了するプログラムである。

_ connection_とはソケット通信を抽象化したものであり、プロトコルのバージョン、ネゴシエーションや認証などをよしなにやってくれるものである。コード例ではローカルにたっているRabbitMQと接続しているが、別のマシン上のRabbitMQとつなぎたいならlocalhostのところにホスト名やIPアドレスを指定すれば良い。

次にchannelを作っているが、色んな処理を一手に引き受けるAPIのほとんどがここにある。

メッセージを送信するにはどのqueueに送るか宣言しなければならない。

queueの宣言は冪等である。つまりまだqueueが作成されてないときにだけ新しく作られる。

メッセージの中身はバイト配列なので、好きなようにエンコードして良い。

最後にchannelconnectionを閉じる。

もしうまくメッセージが送れないときはディスク容量を確認してほしい。デフォルトでは1GB以上の容量がないとメッセージを受け付けられないようになっている。ログファイルを確認して、ディスク下限値を見るなり減らすなりしてほしい。設定ファイルのドキュメントにはどうやってディスク容量制限を変えるか載せている。

メッセージの受信

送信側と違って、受信側はメッセージがないかずっと監視している。(基本的にデーモン)

receive.phpが読み込むコードはsend.phpとほとんど同じである。

送信側と同じようにconnectionchannelを開けて、どのqueueからメッセージを取り出すか宣言する。ただし受信側がメッセージを送ったqueueと一致させなければならない。

queueからメッセージを受け取ったことをサーバに知らせなければならない(ここには書いてないが、受信したことをサーバに通知するのがackである)。サーバから送られてきたメッセージを受け取って処理するコールバックを定義する。メッセージはサーバからクライアントへ非同期的に送られることは念頭に置いておく。

channelがコールバック関数を呼んでいる間はプログラムがブロック状態になる。これでメッセージを受け取ったらコールバックが処理するようになる。


言葉の定義が結構ふわっとしているので、明日はもう少しちゃんと話す。