RabbitMQ チュートリアル１（"Hello World!"）

RabbitMQのチュートリアル１
https://www.rabbitmq.com/tutorials/tutorial-one-python.html
の翻訳です。
翻訳の誤りなどあればご指摘お待ちしております。

###前提条件

このチュートリアルでは、RabbitMQのがインストールされ、ローカルホストの標準のポート（5672）上で実行されている前提とします。別のホスト、ポート、または資格情報を使用する場合には、接続設定の調整が必要です。

###問題が発生した場合

このチュートリアルを通して問題が発生した場合、メーリングリストを通して私たちに連絡することができます。

#はじめに

RabbitMQは、メッセージ·ブローカーです。主なアイデアは非常に単純です：メッセージを受け付け、そして送り届けます。それは郵便局と考えることができます：あなたはポストに手紙を出すとき、郵便配達員が最終的には受取人に配達することを確信しているでしょう。このメタファーによれば、RabbitMQはポストであり、郵便局であり、郵便配達員です。

RabbitMQと郵便局の大きな違いは、紙を扱わないという事実です、その代わりにデータ―メッセージのバイナリブロブを受け入れ、保存し、送り届けます。

RabbitMQおよびメッセージングでは一般的に、いくつかの専門用語が使用されます。

* 「生産」は、送信そのものです。メッセージを送信するプログラムが「生産者」です。私たちはそれを以下のように“P”で描画します：

* 「キュー」は、メールボックスの名前です。これは、RabbitMQの内側にあります。メッセージは、RabbitMQおよびアプリケーションを流れますが、「キュー」の内部にのみ保存されます。「キュー」はあらゆる制限に拘束されません、好きなだけ多くのメッセージを保存することができます、本質的に無限のバッファです。多くの「生産者」が一つの「キュー」にメッセージを送信することができ、多くの「消費者」が一つの「キュー」からデータを受信することを試みることができます。「キュー」は、上部に名前を表記し、以下のように描画します：

* 「消費」は、受信と同様の意味です。「消費者」は、主にメッセージの受信を待機する、プログラムです。私たちはそれを“C”で描画します：

生産者、消費者、およびブローカが同じマシン上に存在する必要はないことに注意してください。実際、ほとんどのアプリケーションではそうではありません。

# Hello World!
#### （pika 0.9.8 Python clientを使用）

私たちの "Hello World"はあまり複雑ではありません、メッセージを送信し、それを受信し、画面に出力しましょう。これを行うには二つのプログラムが必要です、一方がメッセージを送信し、もう一方がそれを受信し出力します。

全体的なデザインは、次のようになります。

生産者は“hello”キューにメッセージを送信します。消費者は、そのキューからメッセージを受信します。

    RabbitMQライブラリ

    RabbitMQは、いくつかのプロトコルを使用します。そのうち、このチュートリアルでカバーしているものは、AMQP 0-9-1と呼ばれます。RabbitMQを使用するには、RabbitMQと同じプロトコルを理解するライブラリが必要になります。ほとんどすべてのプログラミング言語用のライブラリが選択可能です。 Pythonでも、複数のライブラリから選択できます。
    * pika
    * py-amqp
    * py-amqplib
    一連のチュートリアルではPikaを使用します、これはRabbitMQのチームによって推奨されているライブラリです。インストールには、pipパッケージ管理ツールを使用できます。

    $ sudo pip install pika==0.9.8

    このインストールはpipとgit-coreパッケージに依存します、最初にそれらをインストールする必要があります。

    Ubuntuの場合：

      $ sudo apt-get install python-pip git-core

    Debianの場合：

      $ sudo apt-get install python-setuptools git-core
      $ sudo easy_install pip

    Windowsの場合：easy_installをインストールするには、setuptoolsのWindowsインストーラを実行します。

      > easy_install pip
      > PIP install pika==0.9.8

### 送信
最初のプログラムsend.pyはキューに単一のメッセージを送信します。最初にやらなければいけないことはRabbitMQのサーバとの接続を確立することです。

```py
#!/usr/bin/env python
import pika

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

私たちは今、ローカルマシン上のブローカに接続しています（“localhost”）。
別のマシン上のブローカーに接続したい場合は、単にここでマシン名またはIPアドレスを指定します。

次に、送信をおこなう前に、受信者のキューが存在することを確認する必要があります。存在しない場所にメッセージを送信した場合、RabbitMQは単にメッセージを破棄します。メッセージを配信するキューを作成し、“hello”と名付けましょう：

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

これで、メッセージを送信する準備が整いました。私たちの最初のメッセージは、文字列「*Hello World!*」を含みます、それを*hello*キューに送信します。

RabbitMQではメッセージがキューに直接送信されることはありません、それは常に*exchange*を通過する必要があります。しかし、ここでは詳細を掘り下げることはやめましょう、このチュートリアルの第3部で*exchange*についての詳細を読むことができます。今知っておく必要があるのは、空の文字列で識別されるデフォルトの*exchange*を使用する方法です。この*exchange*は特別です、それは、どのキューにメッセージが行くべきか正確に指定することができます。routing_keyパラメータでキュー名を指定する必要があります：

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

プログラムを終了する前に、確実にネットワーク·バッファをフラッシュし、メッセージが実際にRabbitMQに配信されるようにする必要があります。紳士的に接続を閉じることでそれを行うことができます。

```py
connection.close()
```

---
    送信が動作しない！

    RabbitMQを初めて使用し、「送信済み」メッセージが表示ない場合、何が間違っているか頭を悩ませるかもしれません。ブローカーが十分な空きディスク領域なしで起動し（デフォルトでは最低1GBの空き容量が必要です）、メッセージを受け入れることを拒否されたかもしれません。ブローカログファイルを確認し、必要に応じて制約を取り除いてください。設定ファイルのドキュメントには、disk_free_limitを設定する方法が示されています。
---

### 受信
第2のプログラムreceive.pyは、キューからメッセージを受信して画面上に出力します。

ここでも、最初にRabbitMQサーバーに接続する必要があります。RabbitMQに接続するコードは以前と同じです。

次のステップは、先ほどのように、キューが存在することを確認することです。queue_declareを使用してキューを作成することは冪等です、このコマンドは好きなだけ実行することができ、ただ一つのみが作成されます。

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

あなたはなぜ再びキューを宣言するのか疑問に思うかもしれません、すでに前のコードでそれを宣言しました。キューがすでに存在していることが確実であれば、これを避けることができます。例えばsend.pyプログラムがすでに実行された場合です。しかし、最初にどのプログラムが実行されるか、私たちにはまだわかりません。このような場合には、両方のプログラムで繰り返しキューを宣言することをお勧めします。

    キューのリスト

    RabbitMQにどのキューがあり、そこにいくつのメッセージであるか確認することができます。rabbitmqctlツールを使用して（特権ユーザとして）それを行うことができます：

    $ sudo rabbitmqctl list_queues
    Listing queues ...
    hello    0
    ...done.

    (Windowsではsudoを省略)

キューからメッセージを受信することは、より複雑です。これは、キューにコールバック関数を登録することによって動作します。メッセージを受信するたびに、このコールバック関数はPikaライブラリによって呼び出されます。このチュートリアルの場合、この関数は、画面上にメッセージの内容を出力します。

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

次に、このコールバック関数が“hello”キューからメッセージを受信べきことをRabbitMQに指示する必要があります。

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

このコマンドが成功するためには、購読するキューが存在している必要があります。幸いなことに、それは確実です、先ほどqueue_declareを使用してキューを作成しました。

no_ackパラメータについては後述します。

そして最後に、終わりのないループに突入します、データを待ち必要に応じてコールバックを実行します。

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

### すべてのまとめ

send.pyの完全なコード：

```py
 1    #!/usr/bin/env python
 2    import pika
 3
 4    connection = pika.BlockingConnection(pika.ConnectionParameters(
 5            host='localhost'))
 6    channel = connection.channel()
 7
 8    channel.queue_declare(queue='hello')
 9
10    channel.basic_publish(exchange='',
11                          routing_key='hello',
12                          body='Hello World!')
13    print " [x] Sent 'Hello World!'"
14    connection.close()
```

receive.pyの完全なコード：

```py
 1    #!/usr/bin/env python
 2    import pika
 3
 4    connection = pika.BlockingConnection(pika.ConnectionParameters(
 5            host='localhost'))
 6    channel = connection.channel()
 7
 8    channel.queue_declare(queue='hello')
 9
10    print ' [*] Waiting for messages. To exit press CTRL+C'
11
12    def callback(ch, method, properties, body):
13        print " [x] Received %r" % (body,)
14
15    channel.basic_consume(callback,
16                          queue='hello',
17                          no_ack=True)
18
19    channel.start_consuming()
```

これで、ターミナル内でプログラムを試してみることができます。まず、send.pyプログラムを使用してメッセージを送信してみましょう：

```
 $ python send.py
 [x] Sent 'Hello World!'
```

生産者プログラムsend.pyは、すべての実行後に停止します。それを受信してみましょう：

```
 $ python receive.py
 [*] Waiting for messages. To exit press CTRL+C
 [x] Received 'Hello World!'
```

万歳！RabbitMQを通して最初のメッセージを送信することができました。気づいているかもしれませんが、receive.pyプログラムは終了しません。さらなるメッセージを受信する準備のために滞在し、Ctrl-Cで中断することができます。

新しいターミナルでsend.pyを再度実行してみてください。

名前付きキューからメッセージを送信および受信する方法を学びました。第2部に移動し、単純なワークキューを構築しましょう。