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

kombuを味わう

Python RabbitMQ

kombuはceleryの作者askによるメッセージングフレームワーク

同じ作者によるcarrotというライブラリ/フレームワークもあるが、kombuはcarrotをリライトしなおしたもので、今後はkombuの方を開発していくらしい。それにしても、askはどんだけメッセージングが大好きなんだよ。

celeryとcarrot/kombuの違いは、celeryが高レベルのタスクキューAPIを用意しているのに対して、carrot/kombuはより低レベルのよりAMQPに近いAPIを提供していることにあると思っている。個人的にはceleryよりcarrot/kombuの方が小回りが効いて使いやすい。

carrotとkombuを比べるとkombuの方がモジュール構成がシンプルで、APIもより素のAMQPに近いと感じた。

kombuのREADMEに書いてある通りでは一番簡単なサンプルも動かず、けっこうハマッタのでメモを残しておく。READMEにはconsumer.consume()が抜けている!

Producer側。

# -*- coding: utf-8 -*-
from kombu import BrokerConnection, Exchange, Producer

conn = BrokerConnection(hostname='127.0.0.1',
                        port=5672,
                        userid='guest',
                        password='guest',
                        virtual_host='/')

feed_exchange = Exchange("feed", "direct")
channel = conn.channel()

producer = Producer(channel, feed_exchange, auto_declare=True)
producer.publish({"import_feed": "http://cnn.com/rss/edition.rss"},
                 routing_key="importer")

Consumer側。

# -*- coding: utf-8 -*-
from kombu import BrokerConnection, Exchange, Queue, Consumer

conn = BrokerConnection(hostname='127.0.0.1',
                        port=5672,
                        userid='guest',
                        password='guest',
                        virtual_host='/')

feed_exchange = Exchange("feed", "direct")
feed_queue = Queue("feed", feed_exchange, routing_key="importer")
channel = conn.channel()

def import_feed_callback(message_data, message):
    print message_data, message_data
    message.ack()

consumer = Consumer(channel, [feed_queue], auto_declare=True)
consumer.register_callback(import_feed_callback)
consumer.consume()

while 1:
    conn.drain_events()