RabbitMQ

UbuntuにRabbitMQをインストールして動かしてみる

More than 1 year has passed since last update.

調べて見たら、なんだかAMQPの中では、最近(?)は、ActiveMQよりもRabbitMQの方が流行っているっぽい。
メッセージングサービスをちょっと試してみるだけなので、Active MQでもRabbitMQでも違いはないが、ついでのRabbitMQも試してみることにした。

2017年時点で10周年らしく、サイトがActiveMQに比べてずっと近代的な感じだ。

環境

Ubuntu 16.04.3 LTS

インストール

公式サイトのインストールガイドにしたがって進めていく。
https://www.rabbitmq.com/install-debian.html

前提条件

新しめのErlang/OTPを入れとけと書いてある。

アップデートと作業に必要なコマンドをインストールしておく

root@1047d42606da:/# apt-get update -y && apt-get upgrade -y
root@1047d42606da:/# apt-get install wget -y

Earlangのインストール

root@1047d42606da:/# erl +V
bash: erl: command not found

# レポジトリ追加
root@1047d42606da:/# wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
root@1047d42606da:/# dpkg -i erlang-solutions_1.0_all.deb

# Earlangインストール
root@1047d42606da:/# apt-get update -y
root@1047d42606da:/# apt-get install erlang -y

# バージョン確認
root@1047d42606da:/# erl +V
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 9.1
root@1047d42606da:/# erl
Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [kernel-poll:false]

RabbitMQのインストール

# レポジトル登録
root@1047d42606da:/# echo "deb https://dl.bintray.com/rabbitmq/debian xenial main" | tee /etc/apt/sources.list.d/bintray.rabbitmq.list
# Public key追加
root@1047d42606da:/# wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc |apt-key add -
root@1047d42606da:/# apt-get update -y
# RabbitMQのインストール
root@1047d42606da:/# apt-get install rabbitmq-server -y

RabbitMQ を動かす

RabbitMQ起動

Console1
root@1047d42606da:/# rabbitmq-server start 

              RabbitMQ 3.5.7. Copyright (C) 2007-2015 Pivotal Software, Inc.
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/
  ##  ##
  ##########  Logs: /var/log/rabbitmq/rabbit@1047d42606da.log
  ######  ##        /var/log/rabbitmq/rabbit@1047d42606da-sasl.log
  ##########
              Starting broker... completed with 0 plugins.

RabbitMQ Tutorialsを元に動かしてみる。

単純なMessage Queuingを試してみる

Tutorialをもとに進めてみる。
動かすだけならばサンプルコードをcloneして使うだけで十分なのでとりあえずは動かしてみてから、Tutorialの解説を確認してみる。

別のコンソールを立ち上げる。

サンプルコードを動かす環境を整える

Pythonのインストール
Console2
root@1047d42606da:/tmp# python3 -V
Python 3.5.2
root@1047d42606da:/tmp/sender# apt-get install python3-venv -y
gitのインストールとサンプルコードのclone
Console2
root@1047d42606da:/tmp# apt-get install git -y
root@1047d42606da:/tmp# git clone https://github.com/rabbitmq/rabbitmq-tutorials.git
root@1047d42606da:/tmp# ls -l
drwxr-xr-x 25 root root 4096 Dec  3 14:12 rabbitmq-tutorials
サンプルコードを実行環境にコピー
Console2
root@1047d42606da:/tmp# mkdir hello-world && cd hello-world
root@1047d42606da:/tmp/hello-world# cp ../rabbitmq-tutorials/python/send.py ../rabbitmq-tutorials/python/receive.py .
root@1047d42606da:/tmp/hello-world# ls -l
-rwxr-xr-x 1 root root  467 Dec  3 14:17 receive.py
-rwxr-xr-x 1 root root  371 Dec  3 14:17 send.py

送信 (Producer)

別コンソールを立ち上げsend.pyを実行する。

Console3
root@1047d42606da:/tmp# cd hello-world/
root@1047d42606da:/tmp/hello-world# python3 -m venv .
root@1047d42606da:/tmp/hello-world# source bin/activate
(hello-world) root@1047d42606da:/tmp/hello-world# pip install pika
(hello-world) root@1047d42606da:/tmp/hello-world# python send.py 
(hello-world) root@1047d42606da:/tmp/hello-world# python send.py 
 [x] Sent 'Hello World!'

メッセージが送信された。

別コンソールを立ち上げをQueueに入ったメッセージ数を確認する。

Console4
(hello-world) root@1047d42606da:/tmp/hello-world# rabbitmqctl list_queues
Listing queues ...
hello   1

受信 (Consumer)

別コンソールを立ち上げrecive.pyを実行する。

Console5
root@1047d42606da:/tmp# cd hello-world/
root@1047d42606da:/tmp/hello-world# source bin/activate
(hello-world) root@1047d42606da:/tmp/hello-world# python receive.py 
 [*] Waiting for messages. To exit press CTRL+C
 [x] Received b'Hello World!'

別コンソールで送信していたメッセージが受信されている。

別コンソールを立ち上げをQueueに入ったメッセージ数を確認する。

Console4
(hello-world) root@1047d42606da:/tmp/hello-world# rabbitmqctl list_queues
Listing queues ...
hello   0

hello Queueからメッセージが取り出されていることが確認できる。

Producer (send.py)の中身を見てみる

send.py
import pika

Pypiの説明をみると、
PikaはRabbitMQのPython用Clientライブラリらしい。
PikaはRabbitMQのExtensionを含んだAMQPプロトコルのPurePython実装らしい。
PikaはいくつかのAdapter(Connection)を提供しているが、今回のサンプルではBlockingConnectionを使用している。

  • BlockingConnection - 単純な用途に使う同期的なブロッキング処理を可能にする

localhostのBrokerに接続する。

send.py
connection = pika.BlockingConnection(pika.ConnectionParameters(
        host='localhost'))
channel = connection.channel()

使用するQueueを宣言する。 (hello)

send.py
channel.queue_declare(queue='hello')

'hello' Queueに 'Hello World!' というメッセージを送信して、コネクションをクローズする。

send.py
channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

Consumer (recieve.py)の中身を見てみる

localhostのBrokerに接続する。

recieve.py
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
        host='localhost'))
channel = connection.channel()

使用するQueueを宣言する。 (hello)

recieve.py
channel.queue_declare(queue='hello')

メッセージ受信時にPikaに呼ばれるコールバックを作成する。
ここでは単純に受信したメッセージをプリントするだけ。

recieve.py
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

RabbitMQにcallbackに'hello' Queueからのメッセージを受け取ることを教える。

recieve.py
channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

データを待ち受けコールバックを実行する無限ループに入る。

recieve.py
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()