読者です 読者をやめる 読者になる 読者になる

RabbitMQを試してみる

RabbitMQ Python

RabbitMQはErlang製のMQ。

メッセージングならばActiveMQでいい気もするが、僕自身がJavaよりもErlangへのシンパシーが強いのと、ActiveMQPythonで使うにあったってStompライブラリがたくさんありすぎて、そのわりにどれもイマイチ感がぬぐえないので、RabbitMQとAMQPの組み合わせを試してみる。

CentOSにインストールする

まずErlangが必要。R12B-5がリリースされて久しいらしいが、僕はFedora 10のSRPMをrebuildしてR12B-4をインストールした。ビルドするにあたってこちらで紹介されているパッチが役に立った。

RPMでErlangを入れておけば、RabbitMQが配布しているRPMを使えば簡単にインストールできるので楽。

py-amqplibをインストールする

PythonからRabbitMQ(AMQP)を使うには、py-amqplibを使う。

$ sudo easy_install amqplib

もしくは、

$ sudo pip install amqplib

メッセージ送受信の例

ほとんど、py-amqplibのサンプルコードの写経だけど、メッセージ受信側はこんな感じ。

from __future__ import with_statement
from contextlib import closing
import amqplib.client_0_8 as amqp

SERVER = dict(host='localhost',
              userid='guest',
              password='guest',
              ssl=False)

def callback(msg):
    for key, val in msg.properties.items():
        print '%s: %s' % (key, str(val))
    for key, val in msg.delivery_info.items():
        print '> %s: %s' % (key, str(val))

    print ''
    print msg.body
    print '-------'
    msg.channel.basic_ack(msg.delivery_tag)

with closing(amqp.Connection(**SERVER)) as conn:
    with closing(conn.channel()) as ch:
        ch.access_request("/data", active=True, read=True)

        ch.exchange_declare('myfan', 'fanout', auto_delete=True)

        qname, _, _ = ch.queue_declare()
        ch.queue_bind(qname, 'myfan')
        ch.basic_consume(qname, callback=callback)

        while ch.callbacks:
            ch.wait()

メッセージ送信側。

from __future__ import with_statement
from contextlib import closing
import amqplib.client_0_8 as amqp

SERVER = dict(host='localhost',
              userid='guest',
              password='guest',
              ssl=False)

with closing(amqp.Connection(**SERVER)) as conn:
    with closing(conn.channel()) as ch:
        ch.access_request("/data", active=True, write=True)

        ch.exchange_declare('myfan', 'fanout', auto_delete=True)

        msg = amqp.Message("Hello World",
                           content_type="text/plain",
                           application_headers={})

        ch.basic_publish(msg, 'myfan')

細かい点はまだよく分からないが、AMQPのSpecificationを読む価値はありそうだという感じはする。py-amqplibのコードもきれいに書かれている。