This is a release candidate for 1.0, a major milestone for Bunny. It is 100% backwards
compatible with 0.10.x.
Changes between Bunny 1.0.0.pre6 and 1.0.0.rc1
amq-protocol Update
Minimum amq-protocol version is now 1.8.0 which includes
a bug fix for messages exactly 128 Kb in size.
Add timeout Bunny::ConsumerWorkPool#join
Bunny::ConsumerWorkPool#join now accepts an optional
timeout argument.
Plans for 1.0.0 Final
We plan to release Bunny 1.0.0 on October 29th, 2013. The library
has had its soaking period in the last few months and several issues
were fixed during 0.10.x releases.
It has being adopted by many commercial users and fairly mature open source projects, such as Hutch.
Now is a good time to give Bunny a try, help us improve the documentation
and report any usability issues you may find.
This release is ready for amqp gem users to try it out. It includes
a couple of usability improvements, internal code reorganization (amq-client
is no longer used), amq-protocol update and more long time deprecated
API elements removed.
All users are encouraged to try this new version to make upgrading to
1.1.0 easy in the future.
Changes Between 1.0.0 and 1.1.0
amq-protocol Update
Minimum amq-protocol version is now 1.8.0 which includes
a bug fix for messages exactly 128 Kb in size.
AMQ::Client is Removed
amq-client has been incorporated into amqp gem. AMQ::Client and related
modules are no longer available.
AMQP::Channel#confirm_select is Now Delayed
AMQP::Channel#confirm_select is now delayed until after the channel
is opened, making it possible to use it with the pseudo-synchronous
code style.
RabbitMQ Extensions are Now in Core
amqp gem has been targeting RabbitMQ exclusively for a while now.
RabbitMQ extensions are now loaded by default and will be even more
tightly integrated in the future.
AMQP::Channel.default is Removed
AMQP::Channel.default and method_missing-based operations on the default
channel has been removed. They’ve been deprecated since 0.6.
AMQP::Channel#rpc is Removed
AMQP::RPC-related code has been removed. It has been deprecated
since 0.7.
AMQP::Channel.on_error is Removed
Long time deprecated AMQP::Channel.on_error is removed.
This release is a release candidate of 2.0 that introduces one
usability improvement.
2.0 should be production ready from the stability perspective but has
breaking API changes. Please consult the change log below before
considering upgrading.
March Hare
2.0.0.rc1 is
released to rubygems.org. With this release, the project changes
name from Hot Bunnies (an unfortunate original name that has a sexist meaning)
to March Hare.
This release is a release candidate of 2.0.
2.0 should be production ready from the stability perspective but has breaking API changes.
Please consult the change log below before considering upgrading.
Changes Between 1.5.0 and 2.0.0
March Hare (previously Hot Bunnies) 2.0 has breaking API changes.
New Name
March Hare is the new project name. The previous name had a sexist
meaning (unintentionally) and changing it was long overdue.
exchange.unbind Support
MarchHare::Exchange#unbind is now provided to compliment
MarchHare::Exchange#bind.
Safe[r] basic.ack, basic.nack and basic.reject implementation
Previously if a channel was recovered (reopened) by automatic connection
recovery before a message was acknowledged or rejected, it would cause
any operation on the channel that uses delivery tags to fail and
cause the channel to be closed.
To avoid this issue, every channel keeps a counter of how many times
it has been reopened and marks delivery tags with them. Using a stale
tag to ack or reject a message will produce no method sent to RabbitMQ.
Note that unacknowledged messages will be requeued by RabbitMQ when connection
goes down anyway.
This involves an API change: MarchHare::Headers#delivery_tag is now
and instance of a class that responds to #to_i and is accepted
by MarchHare::Channel#ack and related methods.
Integers are still accepted by the same methods.
Consumer Work Pool Changes
MarchHare 1.x used to maintain a separate executor (thread pool) per non-blocking
consumer. This is not optimal and reimplements the wheel RabbitMQ Java client
already has invented: it dispatches consumer methods in a thread pool maintained
by every connection.
Instead of maintaining its own executor, MarchHare now relies on the Java client
to do the job.
It is still possible to override the executor when opening a connection by
providing an executor factory (any Ruby callable):
MarchHare::Queue#subscribe_with and MarchHare::Queue#build_consumer are new method
that allow using consumer objects, for example, to first instantiate a blocking consumer
and pass the reference around so it can be cancelled from a different thread later.
Passing a block for the :on_cancellation option to MarchHare::Queue#subscribe
lets you support RabbitMQ consumer cancellation. The block should take 3
arguments: a channel, a consumer and a consumer tag.
MarchHare Operations Now Raise Ruby Exceptions
MarchHare used to expose RabbitMQ Java client’s channel implementation
directly to Ruby code. This means that whenever an exception was raised,
it was a Java exception (commonly java.io.IOException, wrapping a shutdown
signal).
Not only this severely violates the Principle of Least Surprise, it also
makes it much harder to inspect the exception and figure out how to get
relevant information from it without reading the RabbitMQ Java client
source.
Hot Bunnies 2.0+ provides a Ruby implementation of MarchHare::Channel
which rescues Java exceptions and turns them into Ruby
exceptions.
For example, handling a queue.bind failure now can be demonstrated
with the following straightforward test:
123456789101112131415
context"when the exchange does not exist"doit"raises an exception"doch=connection.create_channelq=ch.queue("",:auto_delete=>true)raised=nilbeginq.bind("asyd8a9d98sa73t78hd9as^&&(&@#(*^")rescueMarchHare::NotFound=>eraised=eendraised.channel_close.reply_text.should=~/no exchange/endend
or have otherwise meaningful names that follow Bunny names closely:
MarchHare::PossibleAuthenticationFailureError
MarchHare::ChannelAlreadyClosed
MarchHare::Queue#subscribe Now Returns a Consumer
This is a breaking API change
MarchHare::Queue#subscribe now returns a consumer (a MarchHare::Consumer instance)
that can be cancelled and contains a consumer tag.
MarchHare::Subscription was eliminated as redundant. All the same methods are
now available on MarchHare::Consumer subclasses.
MarchHare::Queue#subscribe Uses :block => false By Default
This is a breaking API change
MarchHare::Queue#subscribe now uses :block => false by default, thus
not blocking the caller. This reduces the need to use explicitly
started threads for consumers.
This is also how Bunny 0.9 works and we’ve seen this default to be
a better idea.
More Convenient Way of Creating Thread Pools
MarchHare allows you to pass your own thread pool to MarchHare::Queue#subscribe via
the :executor option. Choosing the right thread pool size can make a huge difference
in throughput for applications that use non-blocking consumers.
Previously to 2.0, MarchHare required using Java interop and being familiar
with JDK executors API to instantiate them.
MarchHare 2.0 introduces MarchHare::ThreadPools that has convenience methods
that make it easier:
123456789101112
# fixed size thread pool of size 1MarchHare::ThreadPools.single_threaded# fixed size thread pool of size 16MarchHare::ThreadPools.fixed_of_size(16)# dynamically growing thread pool, will allocate new threads# as neededMarchHare::ThreadPools.dynamically_growing# in contextsubscribe(:blocking=>false,:executor=>MarchHare::ThreadPools.single_threaded)do|metadata,payload|# ...end
RabbitMQ Java Client Upgrade
Hot Bunnies now uses RabbitMQ Java client 3.1.
Queue Predicates
MarchHare::Queue now provides several predicate methods:
This release is a development milestone. 2.0.0.pre13 focuses on improving
network connection recovery.
2.0 should be production ready from the stability perspective but has breaking API changes.
Please consult the change log below before considering upgrading.
Changes Between 2.0.0.pre12 and 2.0.0.pre13
Continuous Reconnection
HotBunnies will now continuously try to reconnect after network failure (every N seconds
at the moment, no exponential backoff).
Plans for 2.0.0 Final
There is still a few things we need to do before HotBunnies 2.0 can be declared complete: