今回はチュートリアル1「Hello World!」を学ぶ。
関連記事
- CentOS7.3にRabbitMQをインストールしてGUIで管理できるようにする
- チュートリアル1「Hello World」 ←いまここ
- チュートリアル2「Work queues」
- チュートリアル3「Publish/Subscribe」
- チュートリアル4「Routing」
- チュートリアル5「Topics」
- チュートリアル6「RPC」
今回学ぶこと
- RabbitMQの導入方法
- Node.jsの導入方法
- 基本的なメッセージのやりとり
RabbitMQを導入する
詳しくは以下の記事を参照してください。
環境は以下のとおり。
- OS: CentOS 6.8
- RabitMQ: v3.6.1
- Node.js: v6.9.5
- amqplib: v0.5.1
Introduction
RabbitMQはメッセージブローカー(メッセージを仲介してくれるシステム)で、メッセージを受け取り、転送する役割を持っている。
その役割は郵便局に例えることができる。
誰かに手紙を送るときは、郵便局で手紙を出す。
誰かから手紙を受け取るときは、郵便受けを確認して取り出す。
お互いどういった経路でどうやって配送されたかは、郵便局の人がやってくれるので意識する必要がない。
RabbitMQと郵便局の違いといえば、扱うものが物理なのかバイナリデータなのかだけ。
郵便局のくだりをRabbitMQの用語に置き換えると、以下のようになる。
- 手紙を出す人: Producer(Publisherともいう)
- 手紙を受け取る人: Consumer(Subscriberともいう)
- 郵便局: Broker(RabbitMQ本体)
- 郵便窓口: Exchange
- 郵便受け: Message Queue
- 配達員: Binding
Node.jsをインストールする
このチュートリアルではRabbitMQがはいっているサーバでアプリケーションも動かしたいので、CentOSにNode.jsをインストールする。
※ 普通はRabbitMQサーバとアプリケーションサーバは別々にする
# Node.jsのインストール
$ curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
$ yum -y install nodejs
# バージョン確認
$ node -v
v 6.9.5
$ npm -v
3.10.10
WindowsにNode.jsをインストールしたい場合は、以下の記事を参考にしてください。
Hello World!
まずは単純にメッセージを送信して、受信する処理を書く。
クライアントライブラリをインストールする
RabbitMQの公式クライアントライブラリはErlang、Java、C#しかないけど、有志がNode.js用のライブラリもつくってくれているので、npmを使ってamqplibをインストールする。
※ amqplibの他にもnode-amqpがある。コチラのほうが短く書ける気がするけど、チュートリアルに合わせたいのでamqplibを使用する。
$ npm i -S amqplib
$ cat package.json
{
"name": "RabbitMQ Tutorial",
"dependencies": {
"amqplib": "^0.5.1"
}
}
メッセージを送信する
まずはNode.jsからメッセージを送信するプログラム(send.js)を書く。
※ オプション(durable: falseなど)はチュートリアル2ででてくるので、ここでは触れません
※ 実はPromiseベースで実装できたりするけど、ここでは触れません
// send.js
const amqp = require('amqplib/callback_api');
// Connect to RabbitMQ server
amqp.connect('amqp://username:password@localhost:5672', (err, conn) => {
conn.createChannel((err, ch) => {
// キューの名前
const q = 'hello';
// hello というキューを定義
ch.assertQueue(q, {durable: false});
// hello キューに 'Hello World'というメッセージを送信
ch.sendToQueue(q, Buffer.from('Hello World'));
console.log(' [x] Sent "Hello World"');
// コネクションを切断&プロセス終了
setTimeout(() => {
conn.close();
process.exit(0);
}, 500);
});
});
# メッセージの送信
$ node send.js
[x] Sent "Hello World"
# Queueにたまったか確認
$ rabbitmqctl list_queues
Listing queues ...
hello 1
「q='hello'」がキューの名前で、sendToQueueの「Hello World」が送信するメッセージの内容。
Node.jsのバージョンが6未満の場合は「Buffer.from」のところを「new Bugger('Hello World')」と実装する。(6以降だとES6の記述ができるのでArray.prototype.fromが使える)
list_queuesでキューを確認すると「hello 1」と表示され、キューが1件たまっていることが確認できる。rabbitmq_managementのプラグインを有効にしている場合は、GUIでも確認することができる。
メッセージを受信する
さきほどキューにためたメッセージを受信するためのプログラム(recieve.js)を書く。
// recieve.js
const amqp = require('amqplib/callback_api');
// Connect to RabbitMQ server
amqp.connect('amqp://admin:admin@localhost:5672', (err, conn) => {
conn.createChannel((err, ch) => {
// キューの名前
const q = 'hello';
//hello というキューを定義
ch.assertQueue(q, {durable: false});
console.log(` [*] Waiting for message in ${q}. To exit press CTRL+C`);
// hello キューからメッセージを受信する
ch.consume(q, msg => {
console.log(` [x] Received ${msg.content.toString()}`);
}, { noAck: true });
});
});
# メッセージの受信
$ node receive.js
[*] Waiting for message in hello. To exit press CTRL+C
[x] Received Hello World
^C
# Queueが消化されたか確認
$ rabbitmqctl list_queues
Listing queues ...
hello 0
send.js同様に「q='hello'」がキューの名前で、consumeでメッセージを受信している。
list_queuesでキューを確認すると「hello 0」と、キューが消化されたことが確認できる。
ここまででチュートリアル1「Hello World」は終了。
次回はチュートリアル2「Work queues」をやっていく。
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿