Changelog History
Page 12
-
v2.2.1 Changes
π :release-date: 2012-06-21 01:00 P.M BST π :release-by: Ask Solem
0οΈβ£ SQS: Default visibility timeout is now 30 minutes.
Since we have ack emulation the visibility timeout is only in effect if the consumer is abrubtly terminated.
retry argument to
Producer.publish
now works properly, when the declare argument is specified.Json serializer: didn't handle buffer objects (Issue #135).
Fix contributed by Jens Hoffrichter.
π Virtual: Now supports passive argument to
exchange_declare
.0οΈβ£ Exchange & Queue can now be bound to connections (which will use the default channel):
.. code-block:: pycon
>>> exchange = Exchange('name') >>> bound_exchange = exchange(connection) >>> bound_exchange.declare()
SimpleQueue
&SimpleBuffer
can now be bound to connections (which will use the default channel).Connection.manager.get_bindings
now works for librabbitmq and pika.β Adds new transport info attributes:
Transport.driver_type
Type of underlying driver, e.g. "amqp", "redis", "sql".
Transport.driver_name
Name of library used e.g. "amqplib", "redis", "pymongo".
Transport.driver_version()
Version of underlying library.
.. _version-2.2.0:
-
v2.2.0 Changes
π :release-date: 2012-06-07 03:10 P.M BST π :release-by: Ask Solem
.. _v220-important:
Important Notes
π The canonical source code repository has been moved to
Pidbox: Exchanges used by pidbox are no longer auto_delete.
Auto delete has been described as a misfeature, and therefore we have disabled it.
For RabbitMQ users old exchanges used by pidbox must be removed, these are named
mailbox_name.pidbox
, andreply.mailbox_name.pidbox
.The following command can be used to clean up these exchanges:
.. code-block:: text
$ VHOST=/ URL=amqp:// python -c'import sys,kombu;[kombu.Connection( sys.argv[-1]).channel().exchange_delete(x) for x in sys.argv[1:-1]]' \ $(sudo rabbitmqctl -q list_exchanges -p "$VHOST" \ | grep \.pidbox | awk '{print $1}') "$URL"
The :envvar:
VHOST
variable must be set to the target RabbitMQ virtual host, and the :envvar:URL
must be the AMQP URL to the server.The
amqp
transport alias will now use :mod:librabbitmq
if installed.py-librabbitmq
_ is a fast AMQP client for Python using the librabbitmq C library.It can be installed by:
.. code-block:: console
$ pip install librabbitmq
It will not be used if the process is monkey patched by eventlet/gevent.
.. _
py-librabbitmq
: https://github.com/celery/librabbitmq.. _v220-news:
π News
Redis: Ack emulation improvements.
Reducing the possibility of data loss.
Acks are now implemented by storing a copy of the message when the message is consumed. The copy is not removed until the consumer acknowledges or rejects it.
This means that unacknowledged messages will be redelivered either when the connection is closed, or when the visibility timeout is exceeded.
Visibility timeout
This is a timeout for acks, so that if the consumer does not ack the message within this time limit, the message is redelivered to another consumer.
The timeout is set to one hour by default, but can be changed by configuring a transport option:
>>> Connection('redis://', transport_options={ ... 'visibility_timeout': 1800, # 30 minutes ... })
NOTE: Messages that have not been acked will be redelivered if the visibility timeout is exceeded, for Celery users this means that ETA/countdown tasks that are scheduled to execute with a time that exceeds the visibility timeout will be executed twice (or more). If you plan on using long ETA/countdowns you should tweak the visibility timeout accordingly:
.. code-block:: python
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 18000} # 5 hours
Setting a long timeout means that it will take a long time for messages to be redelivered in the event of a power failure, but if so happens you could temporarily set the visibility timeout lower to flush out messages when you start up the systems again.
Experimental
Apache ZooKeeper
_ transportMore information is in the module reference: :mod:
kombu.transport.zookeeper
.Contributed by Mahendra M.
.. _
Apache ZooKeeper
: http://zookeeper.apache.org/π Redis: Priority support.
The message's
priority
field is now respected by the Redis transport by having multiple lists for each named queue. The queues are then consumed by in order of priority.The priority field is a number in the range of 0 - 9, where 0 is the default and highest priority.
The priority range is collapsed into four steps by default, since it is unlikely that nine steps will yield more benefit than using four steps. The number of steps can be configured by setting the
priority_steps
transport option, which must be a list of numbers in sorted order:.. code-block:: pycon
>>> x = Connection('redis://', transport_options={ ... 'priority_steps': [0, 2, 4, 6, 8, 9], ... })
Priorities implemented in this way is not as reliable as priorities on the server side, which is why nickname the feature "quasi-priorities"; Using routing is still the suggested way of ensuring quality of service, as client implemented priorities fall short in a number of ways, e.g. if the worker is busy with long running tasks, has prefetched many messages, or the queues are congested.
Still, it is possible that using priorities in combination with routing can be more beneficial than using routing or priorities alone. Experimentation and monitoring should be used to prove this.
Contributed by GermΓ‘n M. Bravo.
Redis: Now cycles queues so that consuming is fair.
This ensures that a very busy queue won't block messages from other queues, and ensures that all queues have an equal chance of being consumed from.
This used to be the case before, but the behavior was accidentally changed while switching to using blocking pop.
Redis: Auto delete queues that are bound to fanout exchanges is now deleted at channel.close.
π¨ amqplib: Refactored the drain_events implementation.
0οΈβ£ Pidbox: Now uses
connection.default_channel
.Pickle serialization: Can now decode buffer objects.
Exchange/Queue declarations can now be cached even if the entity is non-durable.
This is possible because the list of cached declarations are now kept with the connection, so that the entities will be redeclared if the connection is lost.
Kombu source code now only uses one-level of explicit relative imports.
π .. _v220-fixes:
π Fixes
eventio: Now ignores ENOENT raised by
epoll.register
, and EEXIST fromepoll.unregister
.eventio: kqueue now ignores :exc:
KeyError
on unregister.π Redis:
Message.reject
now supports therequeue
argument.π Redis: Remove superfluous pipeline call.
Fix contributed by Thomas Johansson.
Redis: Now sets redelivered header for redelivered messages.
π Now always makes sure references to :func:
sys.exc_info
is removed.π Virtual: The compression header is now removed before restoring messages.
β More tests for the SQLAlchemy backend.
Contributed by Franck Cuny.
π Url parsing did not handle MongoDB URLs properly.
Fix contributed by Flavio Percoco Premoli.
0οΈβ£ Beanstalk: Ignore default tube when reserving.
Fix contributed by Zhao Xiaohong.
π Nonblocking consume support
librabbitmq, amqplib and redis transports can now be used non-blocking.
The interface is very manual, and only consuming messages is non-blocking so far.
The API should not be regarded as stable or final in any way. It is used by Celery which has very limited needs at this point. Hopefully we can introduce a proper callback-based API later.
Transport.eventmap
Is a map of
fd -> callback(fileno, event)
to register in an eventloop.π
Transport.on_poll_start()
Is called before every call to poll. The poller must support
register(fd, callback)
andunregister(fd)
methods.π
Transport.on_poll_start(poller)
Called when the hub is initialized. The poller argument must support the same interface as :class:
kombu.utils.eventio.poll
.Connection.ensure_connection
now takes a callback argument which is called for every loop while the connection is down.β Adds
connection.drain_nowait
This is a non-blocking alternative to drain_events, but only supported by amqplib/librabbitmq.
drain_events now sets
connection.more_to_read
if there is more data to read.This is to support eventloops where other things must be handled between draining events.
.. _version-2.1.8:
-
v2.1.8 Changes
π :release-date: 2012-05-06 03:06 P.M BST π :release-by: Ask Solem
Bound Exchange/Queue's are now pickleable.
Consumer/Producer can now be instantiated without a channel, and only later bound using
.revive(channel)
.ProducerPool now takes
Producer
argument.:func:
~kombu.utils.fxrange
now counts forever if the stop argument is set to None. (fxrange is like xrange but for decimals).π Auto delete support for virtual transports were incomplete and could lead to problems so it was removed.
Cached declarations (:func:
~kombu.common.maybe_declare
) are now bound to the underlying connection, so that entities are redeclared if the connection is lost.This also means that previously uncacheable entities (e.g. non-durable) can now be cached.
compat ConsumerSet: can now specify channel.
.. _version-2.1.7:
-
v2.1.7 Changes
π :release-date: 2012-04-27 06:00 P.M BST π :release-by: Ask Solem
- compat consumerset now accepts optional channel argument.
.. _version-2.1.6:
-
v2.1.6 Changes
π :release-date: 2012-04-23 01:30 P.M BST π :release-by: Ask Solem
π SQLAlchemy transport was not working correctly after URL parser change.
maybe_declare now stores cached declarations per underlying connection instead of globally, in the rare case that data disappears from the broker after connection loss.
Django: Added South migrations.
Contributed by Joseph Crosland.
.. _version-2.1.5:
-
v2.1.5 Changes
π :release-date: 2012-04-13 03:30 P.M BST π :release-by: Ask Solem
π The url parser removed more than the first leading slash (Issue #121).
SQLAlchemy: Can now specify url using + separator
Example:
.. code-block:: python
Connection('sqla+mysql://localhost/db')
π Better support for anonymous queues (Issue #116).
Contributed by Michael Barrett.
Connection.as_uri
now quotes url parts (Issue #117).Beanstalk: Can now set message TTR as a message property.
Contributed by Andrii Kostenko
.. _version-2.1.4:
-
v2.1.4 Changes
π :release-date: 2012-04-03 04:00 P.M GMT π :release-by: Ask Solem
π MongoDB: URL parsing are now delegated to the pymongo library (Fixes Issue #103 and Issue #87).
Fix contributed by Flavio Percoco Premoli and James Sullivan
SQS: A bug caused SimpleDB to be used even if sdb persistence was not enabled (Issue #108).
Fix contributed by Anand Kumria.
Django: Transaction was committed in the wrong place, causing data cleanup to fail (Issue #115).
Fix contributed by Daisuke Fujiwara.
π MongoDB: Now supports replica set URLs.
Contributed by Flavio Percoco Premoli.
Redis: Now raises a channel error if a queue key that is currently being consumed from disappears.
Fix contributed by Stephan Jaekel.
All transport 'channel_errors' lists now includes
kombu.exception.StdChannelError
.All kombu exceptions now inherit from a common :exc:
~kombu.exceptions.KombuError
.
.. _version-2.1.3:
-
v2.1.3 Changes
π :release-date: 2012-03-20 03:00 P.M GMT π :release-by: Ask Solem
π Fixes Jython compatibility issues.
π Fixes Python 2.5 compatibility issues.
.. _version-2.1.2:
-
v2.1.2 Changes
π :release-date: 2012-03-01 01:00 P.M GMT π :release-by: Ask Solem
- π amqplib: Last version broke SSL support.
.. _version-2.1.1:
-
v2.1.1 Changes
π :release-date: 2012-02-24 02:00 P.M GMT π :release-by: Ask Solem
π Connection URLs now supports encoded characters.
π Fixed a case where connection pool could not recover from connection loss.
Fix contributed by Florian Munz.
We now patch amqplib's
__del__
method to skip trying to close the socket if it is not connected, as this resulted in an annoying warning.π° Compression can now be used with binary message payloads.
Fix contributed by Steeve Morin.
.. _version-2.1.0: