2017/02/22

Node.js+RabbitMQでメッセージの送受信をする1(Hello World)

仕事でRabbitMQまわりの一部システムを担当することになった。フロントエンド畑の人なので、Node.jsをつかってRabbitMQのチュートリアルをテキトーに和訳し、他で得た知識で補足しながら勉強した内容をまとめていこうと思う。

今回はチュートリアル1「Hello World!」を学ぶ。



関連記事




今回学ぶこと


  • 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 件のコメント :

コメントを投稿