Tech Sketch Bucket of Technical Chips by TIS Inc.

RabbitMQを使ってみる〜インストール編〜

Pocket

この記事はeXcale Developer's Blogから移転されたものです。




eXcale開発チームの泉谷(@syguer)です。
今回はMessage QueuingのためのミドルウェアであるRabbitMQについて紹介します。
eXcaleでは、裏側の仕組みとして各コンポーネントがメッセージでやり取りをするようにしています。
それによってコンポーネント同士を疎結合にすることができます。また非同期処理により処理全体の効率化を実現しています。
RabbitMQはその中核となっています。


RabbitMQとは

RabbitMQはメッセージキューイングのためのミドルウェアです。オープンソースで公開されています。
もともとはRabbit Technologies社が開発していたものですが、現在はPivotal Softwareのもとで開発されているようです。

RabbitMQ公式サイト
http://www.rabbitmq.com/

RabbitMQではAMQPというプロトコルを使って、メッセージをやりとりします。
AMQPとはAdvanced Message Queuing Protocolの略で、メッセージを扱う際の取り決めです。

RabbitMQはメッセージを送るコンポーネントと送られるコンポーネントの間に入って、メッセージを受け取る、渡すというシンプルな動きをします。
メッセージのやり取りの間にキューが入ることによって、メッセージ送信側はメッセージを受信した側の処理が終わるのを待つ必要がなくなり、非同期処理が実現できます。
また、メッセージのやり取りをキューに任せることによってコンポーネント間を疎結合にすることができます。

RabbitMQのインストール

Windows(.exe)、RHEL/Fedora(.rpm)、Debian/Ubuntu(.deb)と各プラットフォーム用にそれぞれインストーラーが用意されていますが、今回はCentOSに公式サイトで配布されているrpmから最新版をインストールしてみたいと思います。
本記事執筆時点での最新版は3.3.0です。

RabbitMQはerlangで実装されているため、まずはerlangをインストールします。

続いてRabbitMQのインストールです。


RabbitMQの起動

インストールが完了したら早速起動してみましょう。
操作のコマンドは以下のようになっています。

RabbitMQの管理ツール

rabbitmqにはrabbitmqctlというデフォルトの操作コマンドがあるものの、若干機能としては貧弱です。
そのため、別途用意されているpython製のCLI管理ツールを使います。

まず、RabbitMQの管理用プラグインを有効化します。(RabbitMQの再起動が必要です)

管理ツールはRabbitMQに含まれているので下記コマンドでダウンロードします。

※wgetでアクセスするポートが3.x系から15672になりました。2.x系を使う場合は55672にアクセスしてください。

rabbitmqadminを使えば以下のようなコマンドで簡単にキューを操作できます。

他にも色々できるので公式ドキュメントを参照し、試してみてください。

動作確認

では、実際に使ってみましょう。
簡単なRubyスクリプトを使ってキューが使えているか試してみます。
今回はamqpというgemを使います。

このgemはRubyでAMQPを使うためのgemです。
今回は機能は簡単なものしか使いませんが、詳細なドキュメントが用意されているので参考にしてください。

以下スクリプトの例です。
・メッセージを送る

送る側は10行目でAMQPコネクションをオープンして、15行目で送信しています。
送信時に指定している:routing_keyは送信する対象のキュー名です(厳密にはrouting_key=キュー名ではないのですが、このサンプルではここにキュー名を入れるという認識で問題ありません)。
5〜8行目でセットしている値はmqのデフォルトの値なので、特にいじらなくても動くと思います。
amqpを使うプログラムで注意しなければならないのは、amqpでは内部でEventmachineという非同期処理のライブラリを用いているので、EventMachine.stopを実行しないとプログラムが終了しないという点です。
このコードではpublishにコールバックとして与えているブロック(17行目)でクローズをしています。

・メッセージを取り出す

処理の流れや、気をつける点はメッセージの送信と同じです。
取得側ではpopを使ってメッセージを取り出し、出力します。
"Received a message: Hello, world!"が出力されれば成功です。

これでキューを介して値のやり取りができています。
送信した後、受け取った後にrabbitmqadminでキューを見ると、メッセージがキューに入ったり出たりしている様子が見えると思います。


最後に

今回はRabbitMQとそのインストールについて紹介しました。
次回はRabbitMQのクラスタリングについて紹介したいと思います。

エンジニア採用中!私たちと一緒に働いてみませんか?