2010-07-22 14:19:46 +00:00
|
|
|
#############################################
|
2010-06-23 10:08:39 +00:00
|
|
|
kombu - AMQP Messaging Framework for Python
|
2010-07-22 14:19:46 +00:00
|
|
|
#############################################
|
2010-06-23 10:08:39 +00:00
|
|
|
|
2010-11-10 11:31:52 +00:00
|
|
|
:Version: 0.9.4
|
2010-06-23 10:08:39 +00:00
|
|
|
|
2010-10-27 08:34:28 +00:00
|
|
|
Introduction
|
|
|
|
------------
|
|
|
|
|
2010-11-11 15:00:44 +00:00
|
|
|
`Kombu` is an `AMQP`_ messaging queue framework. AMQP is the Advanced Message
|
2010-10-27 08:34:28 +00:00
|
|
|
Queuing Protocol, an open standard protocol for message orientation, queuing,
|
|
|
|
routing, reliability and security.
|
|
|
|
|
2010-11-11 15:00:44 +00:00
|
|
|
The aim of `Kombu` is to make messaging in Python as easy as possible by
|
|
|
|
providing a high-level interface for producing and consuming messages,
|
|
|
|
and provide tested and proven implementations of common messaging patterns.
|
2010-10-27 08:34:28 +00:00
|
|
|
|
2010-11-11 15:00:44 +00:00
|
|
|
`Kombu` has pluggable messaging transports, so it is possible to support
|
2010-10-27 08:34:28 +00:00
|
|
|
several messaging systems. Currently, there is support for `AMQP`_
|
|
|
|
(`py-amqplib`_, `pika`_), `STOMP`_ (`stompy`_). There's also an
|
|
|
|
in-memory transport for testing purposes, using the `Python queue module`_.
|
|
|
|
|
|
|
|
Several AMQP message broker implementations exists, including `RabbitMQ`_,
|
|
|
|
`Apache ActiveMQ`_. You'll need to have one of these installed,
|
|
|
|
personally we've been using `RabbitMQ`_.
|
|
|
|
|
2010-11-11 15:00:44 +00:00
|
|
|
Before you start playing with `Kombu`, you should probably read up on
|
2010-10-27 08:34:28 +00:00
|
|
|
AMQP, and you could start with the excellent article about using RabbitMQ
|
|
|
|
under Python, `Rabbits and warrens`_. For more detailed information, you can
|
|
|
|
refer to the `Wikipedia article about AMQP`_.
|
|
|
|
|
|
|
|
.. _`RabbitMQ`: http://www.rabbitmq.com/
|
|
|
|
.. _`AMQP`: http://amqp.org
|
|
|
|
.. _`STOMP`: http://stomp.codehaus.org
|
|
|
|
.. _`stompy`: http://pypi.python.org/stompy
|
|
|
|
.. _`Python Queue module`: http://docs.python.org/library/queue.html
|
|
|
|
.. _`Apache ActiveMQ`: http://activemq.apache.org/
|
|
|
|
.. _`Django`: http://www.djangoproject.com/
|
|
|
|
.. _`Rabbits and warrens`: http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/
|
|
|
|
.. _`py-amqplib`: http://barryp.org/software/py-amqplib/
|
|
|
|
.. _`pika`: http://github.com/tonyg/pika
|
|
|
|
.. _`Wikipedia article about AMQP`: http://en.wikipedia.org/wiki/AMQP
|
2010-06-23 10:10:02 +00:00
|
|
|
|
2010-10-27 08:34:28 +00:00
|
|
|
Documentation
|
|
|
|
-------------
|
|
|
|
|
|
|
|
Kombu is using Sphinx, and the latest documentation is available at GitHub:
|
|
|
|
|
|
|
|
http://ask.github.com/kombu
|
|
|
|
|
|
|
|
Quick overview
|
|
|
|
--------------
|
|
|
|
|
|
|
|
.. code-block:: python
|
2010-10-27 12:22:29 +00:00
|
|
|
|
2010-07-20 13:00:17 +00:00
|
|
|
from kombu.connection BrokerConnection
|
2010-08-01 09:41:03 +00:00
|
|
|
from kombu.messaging import Exchange, Queue, Consumer, Producer
|
2010-06-23 10:10:02 +00:00
|
|
|
|
|
|
|
media_exchange = Exchange("media", "direct", durable=True)
|
2010-08-01 09:41:03 +00:00
|
|
|
video_queue = Queue("video", exchange=media_exchange, key="video")
|
2010-06-23 10:10:02 +00:00
|
|
|
|
|
|
|
# connections/channels
|
2010-07-20 13:00:17 +00:00
|
|
|
connection = BrokerConnection("localhost", "guest", "guest", "/")
|
2010-06-23 10:10:02 +00:00
|
|
|
channel = connection.channel()
|
|
|
|
|
|
|
|
# produce
|
|
|
|
producer = Producer(channel, exchange=media_exchange, serializer="json")
|
|
|
|
producer.publish({"name": "/tmp/lolcat1.avi", "size": 1301013})
|
|
|
|
|
|
|
|
# consume
|
2010-08-01 09:41:03 +00:00
|
|
|
consumer = Consumer(channel, video_queue)
|
2010-06-23 10:10:02 +00:00
|
|
|
consumer.register_callback(process_media)
|
|
|
|
consumer.consume()
|
|
|
|
|
2010-10-27 08:34:28 +00:00
|
|
|
# Process messages on all channels
|
2010-06-23 10:10:02 +00:00
|
|
|
while True:
|
|
|
|
connection.drain_events()
|
|
|
|
|
2010-10-27 08:34:28 +00:00
|
|
|
# Consume from several queues on the same channel:
|
2010-08-01 09:41:03 +00:00
|
|
|
video_queue = Queue("video", exchange=media_exchange, key="video")
|
|
|
|
image_queue = Queue("image", exchange=media_exchange, key="image")
|
2010-06-23 10:10:02 +00:00
|
|
|
|
2010-08-01 09:41:03 +00:00
|
|
|
consumer = Consumer(channel, [video_queue, image_queue])
|
2010-07-22 14:09:18 +00:00
|
|
|
consumer.consume()
|
|
|
|
|
|
|
|
while True:
|
|
|
|
connection.drain_events()
|
2010-06-23 10:10:02 +00:00
|
|
|
|
|
|
|
|
2010-10-27 08:34:28 +00:00
|
|
|
`Exchange` and `Queue` are simply declarations that can be pickled
|
|
|
|
and used in configuaration files etc.
|
2010-06-29 15:44:24 +00:00
|
|
|
|
2010-11-11 15:00:44 +00:00
|
|
|
They also support operations, but to do so they need to be bound
|
2010-10-27 08:34:28 +00:00
|
|
|
to a channel:
|
|
|
|
|
|
|
|
.. code-block:: python
|
2010-06-29 15:44:24 +00:00
|
|
|
|
|
|
|
>>> exchange = Exchange("tasks", "direct")
|
|
|
|
|
|
|
|
>>> connection = BrokerConnection()
|
|
|
|
>>> channel = connection.channel()
|
2010-07-22 20:10:41 +00:00
|
|
|
>>> bound_exchange = exchange(channel)
|
2010-06-29 15:44:24 +00:00
|
|
|
>>> bound_exchange.delete()
|
|
|
|
|
|
|
|
# the original exchange is not affected, and stays unbound.
|
|
|
|
>>> exchange.delete()
|
|
|
|
raise NotBoundError: Can't call delete on Exchange not bound to
|
|
|
|
a channel.
|
|
|
|
|
2010-06-23 10:08:39 +00:00
|
|
|
Installation
|
|
|
|
============
|
|
|
|
|
2010-11-11 15:00:44 +00:00
|
|
|
You can install `Kombu` either via the Python Package Index (PyPI)
|
2010-06-23 10:08:39 +00:00
|
|
|
or from source.
|
|
|
|
|
2010-10-27 07:17:37 +00:00
|
|
|
To install using `pip`,::
|
2010-06-23 10:08:39 +00:00
|
|
|
|
2010-06-29 19:12:29 +00:00
|
|
|
$ pip install kombu
|
2010-06-23 10:08:39 +00:00
|
|
|
|
2010-10-27 07:17:37 +00:00
|
|
|
To install using `easy_install`,::
|
2010-06-23 10:08:39 +00:00
|
|
|
|
2010-06-29 19:12:29 +00:00
|
|
|
$ easy_install kombu
|
2010-06-23 10:08:39 +00:00
|
|
|
|
|
|
|
If you have downloaded a source tarball you can install it
|
|
|
|
by doing the following,::
|
|
|
|
|
|
|
|
$ python setup.py build
|
|
|
|
# python setup.py install # as root
|
|
|
|
|
|
|
|
|
|
|
|
Terminology
|
|
|
|
===========
|
|
|
|
|
|
|
|
There are some concepts you should be familiar with before starting:
|
|
|
|
|
2010-06-29 19:12:29 +00:00
|
|
|
* Producers
|
2010-06-23 10:08:39 +00:00
|
|
|
|
2010-06-29 19:12:29 +00:00
|
|
|
Producers sends messages to an exchange.
|
2010-06-23 10:08:39 +00:00
|
|
|
|
|
|
|
* Exchanges
|
|
|
|
|
|
|
|
Messages are sent to exchanges. Exchanges are named and can be
|
|
|
|
configured to use one of several routing algorithms. The exchange
|
|
|
|
routes the messages to consumers by matching the routing key in the
|
|
|
|
message with the routing key the consumer provides when binding to
|
|
|
|
the exchange.
|
|
|
|
|
|
|
|
* Consumers
|
|
|
|
|
|
|
|
Consumers declares a queue, binds it to a exchange and receives
|
|
|
|
messages from it.
|
|
|
|
|
|
|
|
* Queues
|
|
|
|
|
|
|
|
Queues receive messages sent to exchanges. The queues are declared
|
|
|
|
by consumers.
|
|
|
|
|
|
|
|
* Routing keys
|
|
|
|
|
|
|
|
Every message has a routing key. The interpretation of the routing
|
|
|
|
key depends on the exchange type. There are four default exchange
|
|
|
|
types defined by the AMQP standard, and vendors can define custom
|
|
|
|
types (so see your vendors manual for details).
|
|
|
|
|
|
|
|
These are the default exchange types defined by AMQP/0.8:
|
|
|
|
|
|
|
|
* Direct exchange
|
|
|
|
|
|
|
|
Matches if the routing key property of the message and
|
2010-10-27 07:17:37 +00:00
|
|
|
the `routing_key` attribute of the consumer are identical.
|
2010-06-23 10:08:39 +00:00
|
|
|
|
|
|
|
* Fan-out exchange
|
|
|
|
|
|
|
|
Always matches, even if the binding does not have a routing
|
|
|
|
key.
|
|
|
|
|
|
|
|
* Topic exchange
|
|
|
|
|
|
|
|
Matches the routing key property of the message by a primitive
|
|
|
|
pattern matching scheme. The message routing key then consists
|
2010-10-27 07:17:37 +00:00
|
|
|
of words separated by dots (`"."`, like domain names), and
|
|
|
|
two special characters are available; star (`"*"`) and hash
|
|
|
|
(`"#"`). The star matches any word, and the hash matches
|
|
|
|
zero or more words. For example `"*.stock.#"` matches the
|
|
|
|
routing keys `"usd.stock"` and `"eur.stock.db"` but not
|
|
|
|
`"stock.nasdaq"`.
|
2010-06-23 10:08:39 +00:00
|
|
|
|
|
|
|
Getting Help
|
|
|
|
============
|
|
|
|
|
|
|
|
Mailing list
|
|
|
|
------------
|
|
|
|
|
|
|
|
Join the `carrot-users`_ mailing list.
|
|
|
|
|
|
|
|
.. _`carrot-users`: http://groups.google.com/group/carrot-users/
|
|
|
|
|
|
|
|
Bug tracker
|
|
|
|
===========
|
|
|
|
|
|
|
|
If you have any suggestions, bug reports or annoyances please report them
|
2010-06-29 19:12:29 +00:00
|
|
|
to our issue tracker at http://github.com/ask/kombu/issues/
|
2010-06-23 10:08:39 +00:00
|
|
|
|
|
|
|
Contributing
|
|
|
|
============
|
|
|
|
|
2010-11-11 15:00:44 +00:00
|
|
|
Development of `Kombu` happens at Github: http://github.com/ask/kombu
|
2010-06-23 10:08:39 +00:00
|
|
|
|
|
|
|
You are highly encouraged to participate in the development. If you don't
|
|
|
|
like Github (for some reason) you're welcome to send regular patches.
|
|
|
|
|
|
|
|
License
|
|
|
|
=======
|
|
|
|
|
2010-10-27 07:17:37 +00:00
|
|
|
This software is licensed under the `New BSD License`. See the :file:`LICENSE`
|
2010-06-23 10:08:39 +00:00
|
|
|
file in the top distribution directory for the full license text.
|