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
|
|
|
|
2011-01-28 19:28:39 +00:00
|
|
|
:Version: 1.0.1
|
2010-06-23 10:08:39 +00:00
|
|
|
|
2010-11-12 14:22:23 +00:00
|
|
|
Synopsis
|
|
|
|
========
|
2010-10-27 08:34:28 +00:00
|
|
|
|
2010-11-12 14:48:42 +00:00
|
|
|
`Kombu` is an `AMQP`_ messaging framework for Python.
|
2010-11-12 14:22:23 +00:00
|
|
|
|
|
|
|
AMQP is the Advanced Message Queuing Protocol, an open standard protocol
|
|
|
|
for message orientation, queuing, routing, reliability and security.
|
2010-10-27 08:34:28 +00:00
|
|
|
|
2010-11-12 14:47:29 +00:00
|
|
|
One of the most popular implementations of AMQP is `RabbitMQ`_.
|
|
|
|
|
2010-11-11 15:00:44 +00:00
|
|
|
The aim of `Kombu` is to make messaging in Python as easy as possible by
|
2010-11-12 14:54:29 +00:00
|
|
|
providing an idiomatic high-level interface for the AMQP protocol, and also
|
|
|
|
provide proven and tested solutions to common messaging problems.
|
2010-11-12 14:22:23 +00:00
|
|
|
|
|
|
|
Features
|
|
|
|
========
|
|
|
|
|
|
|
|
* Allows application authors to support several message server
|
|
|
|
solutions by using pluggable transports.
|
|
|
|
|
2010-11-12 14:31:30 +00:00
|
|
|
* AMQP transports for both the `amqplib`_ (sync) and
|
|
|
|
`pika`_ (sync + async) clients.
|
2010-11-12 14:22:23 +00:00
|
|
|
|
|
|
|
* Virtual transports makes it really easy to add support for non-AMQP
|
2010-11-12 14:31:30 +00:00
|
|
|
transports. There is already built-in support for `Redis`_,
|
|
|
|
`Beanstalk`_, `CouchDB`_, and `MongoDB`_.
|
2010-11-12 14:22:23 +00:00
|
|
|
|
|
|
|
* SQLAlchemy and Django ORM transports exists as plug-ins (
|
|
|
|
`kombu-sqlalchemy`_ and `django-kombu`_).
|
|
|
|
|
|
|
|
* In-memory transport for unit testing.
|
|
|
|
|
|
|
|
* Supports automatic encoding, serialization and compression of message
|
|
|
|
payloads.
|
|
|
|
|
|
|
|
* Consistent exception handling across transports.
|
|
|
|
|
|
|
|
* The ability to ensure that an operation is performed by gracefully
|
|
|
|
handling connection and channel errrors.
|
2010-10-27 08:34:28 +00:00
|
|
|
|
2010-11-12 14:22:23 +00:00
|
|
|
* Several annoyances with `amqplib`_ has been fixed, like supporting
|
|
|
|
timeouts and the ability to wait for events on more than one channel.
|
2010-10-27 08:34:28 +00:00
|
|
|
|
2010-11-12 14:22:23 +00:00
|
|
|
* Projects already using `carrot`_ can easily be ported by using
|
|
|
|
a compatibility layer.
|
2010-10-27 08:34:28 +00:00
|
|
|
|
|
|
|
|
2010-11-12 14:47:29 +00:00
|
|
|
For an introduction to AMQP you should read the article `Rabbits and warrens`_,
|
|
|
|
and the `Wikipedia article about AMQP`_.
|
|
|
|
|
|
|
|
|
2011-01-18 08:20:13 +00:00
|
|
|
|
2010-10-27 08:34:28 +00:00
|
|
|
.. _`RabbitMQ`: http://www.rabbitmq.com/
|
|
|
|
.. _`AMQP`: http://amqp.org
|
2010-11-11 15:05:18 +00:00
|
|
|
.. _`Redis`: http://code.google.com/p/redis/
|
2010-11-12 14:31:30 +00:00
|
|
|
.. _`MongoDB`: http://www.mongodb.org/
|
|
|
|
.. _`CouchDB`: http://couchdb.apache.org/
|
|
|
|
.. _`Beanstalk`: http://kr.github.com/beanstalkd/
|
2010-10-27 08:34:28 +00:00
|
|
|
.. _`Rabbits and warrens`: http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/
|
2010-11-12 14:32:08 +00:00
|
|
|
.. _`amqplib`: http://barryp.org/software/py-amqplib/
|
2010-10-27 08:34:28 +00:00
|
|
|
.. _`pika`: http://github.com/tonyg/pika
|
|
|
|
.. _`Wikipedia article about AMQP`: http://en.wikipedia.org/wiki/AMQP
|
2010-11-11 15:05:18 +00:00
|
|
|
.. _`kombu-sqlalchemy`: http://github.com/ask/kombu-sqlalchemy/
|
|
|
|
.. _`django-kombu`: http://github.com/ask/django-kombu/
|
2010-11-12 14:31:30 +00:00
|
|
|
.. _`carrot`: http://pypi.python.org/pypi/carrot/
|
2010-06-23 10:10:02 +00:00
|
|
|
|
2011-01-18 08:20:13 +00:00
|
|
|
|
|
|
|
Transport Comparison
|
|
|
|
====================
|
|
|
|
|
|
|
|
+---------------+----------+------------+-----------+---------------+
|
|
|
|
| **Client** | **Type** | **Direct** | **Topic** | **Fanout** |
|
|
|
|
+---------------+----------+------------+-----------+---------------+
|
|
|
|
| *amqplib* | Native | Yes | Yes | Yes |
|
|
|
|
+---------------+----------+------------+-----------+---------------+
|
|
|
|
| *pika* | Native | Yes | Yes | Yes |
|
|
|
|
+---------------+----------+------------+-----------+---------------+
|
2011-01-21 09:13:10 +00:00
|
|
|
| *redis* | Virtual | Yes | Yes[*]_ | Yes (PUB/SUB) |
|
2011-01-18 08:20:13 +00:00
|
|
|
+---------------+----------+------------+-----------+---------------+
|
2011-01-21 09:13:10 +00:00
|
|
|
| *beanstalk* | Virtual | Yes | Yes[*]_ | No |
|
2011-01-18 08:20:13 +00:00
|
|
|
+---------------+----------+------------+-----------+---------------+
|
2011-01-21 09:13:10 +00:00
|
|
|
| *mongodb* | Virtual | Yes | Yes[*]_ | No |
|
2011-01-18 08:20:13 +00:00
|
|
|
+---------------+----------+------------+-----------+---------------+
|
2011-01-21 09:13:10 +00:00
|
|
|
| *couchdb* | Virtual | Yes | Yes[*]_ | No |
|
2011-01-18 08:20:13 +00:00
|
|
|
+---------------+----------+------------+-----------+---------------+
|
2011-01-21 09:13:10 +00:00
|
|
|
| *in-memory* | Virtual | Yes | Yes[*]_ | No |
|
2011-01-18 08:20:13 +00:00
|
|
|
+---------------+----------+------------+-----------+---------------+
|
|
|
|
|
|
|
|
|
2011-01-21 09:13:10 +00:00
|
|
|
.. [*] Declarations only kept in memory, so exchanges/queues
|
|
|
|
must be declared by all clients that needs them.
|
2011-01-18 08:20:13 +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
|
|
|
|
--------------
|
|
|
|
|
2010-11-11 15:16:07 +00:00
|
|
|
::
|
2010-10-27 12:22:29 +00:00
|
|
|
|
2010-12-20 19:50:44 +00:00
|
|
|
from kombu.connection import 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:
|
|
|
|
|
2010-11-11 15:16:07 +00:00
|
|
|
::
|
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-11-11 15:16:07 +00:00
|
|
|
This software is licensed under the `New BSD License`. See the `LICENSE`
|
2010-06-23 10:08:39 +00:00
|
|
|
file in the top distribution directory for the full license text.
|