No changes yet.
Replacing x == nil with x.nil? in the frame layer hot path yields a
consistent +15–18% throughput improvement in Frame.decode_header
(called on every received frame) and +12–14% in HeartbeatFrame.encode,
across Ruby 3.3, 3.4, and 4.0.
See benchmarks/BENCHMARKS.md for instructions on how to reproduce these numbers on your machine.
Contributed by @eglitobias.
GitHub issue: #86
And not just truthy values (values that are not nil or false).
Channel::Close now provides predicate methods for identifying common
channel closure reasons by reply code and text:
#delivery_ack_timeout?: consumer delivery acknowledgement timeout#unknown_delivery_tag?: unknown delivery tag (e.g. double ack)#message_too_large?: message exceeded the configured max size
2.4.0 and 2.5.0 versions unintentionally included files that were
symlinks, which caused installation on Windows to fail.
A few more decode method optimizations for consumer delivery code paths.
Optimized encoding and decoding hot paths:
- Built-in
Q>/q>packing/unpacking directives are 6-7x faster than the original implementation (that originally targeted Ruby 1.8.x) - Switched to
unpack1instead ofunpack().firstthroughout - Use
bytesliceinstead ofslicefor binary string operations - Use
getbytefor single byte access (4x faster than alternatives) - Adopted the
frozen_string_literalpragma
The improvements on Ruby 3.4 are very meaningful:
AMQ::Pack.pack_uint64_big_endian: about 6.6x fasterAMQ::Pack.unpack_uint64_big_endian: about 7.2x fasterBasic.Deliver.decode: about 1.7x fasterBasic.Ack/Nack/Reject.encode: about 2.5x faster
Contributed by @Earlopain.
GitHub issue: #80
Contributed by @BenTalagan.
GitHub issue: #79
Contributed by @djrodgerspryor.
GitHub issue: #78
Contributed by @bbascarevic-tti.
GitHub issue: ruby-amqp/amq-protocol#76
Used together with the rabbitmq-auth-backend-oauth2 plugin.
GitHub issue: ruby-amqp/amq-protocol#75.
Contributed by Andrew Babichev.
This is a potentially breaking change. It is recommended that all applications that use this gem and pass date/time values in message properties or headers are upgraded at the same time.
GitHub issue: #64.
Contributed by Carl Hoerberg.
Contributed by Akira Matsuda.
GitHub issue: #62
Byte array values in types now can be decoded (to the extent Ruby type system permits) by this library.
GitHub issue: #58
2.0.0 has breaking changes in header encoding.
Integer values in headers are now encoded as signed 64-bit (was unsigned 32-bit previously, unintentionally).
This is a breaking change: consuming messages with integers in headers published with older versions of this library will break!
Signed 16 bit integers are now decoded correctly.
Signed 8 bit integers are now decoded correctly.
Contributed by Benjamin Conlan.
AMQ::BitSet#next_clear_bit is now drastically more efficient
(down from 6 minutes for 10,000 iterations to 4 seconds for 65,536 iterations).
Contributed by Doug Rohrer, Dave Anderson, and Jason Voegele from Neo.
Messages exactly 128 Kb in size are now framed correctly.
Contributed by Nicolas Viennot.
connection.blocked AMQP 0.9.1 extension is now supported
(should be available as of RabbitMQ 3.2).
Encoding of large payloads is now done more efficiently.
Contributed by Greg Brockman.
AMQ::Settings extracts settings merging logic and AMQP/AMQPS URI parsing from amq-client.
Parsing follows the same convention amqp gem and RabbitMQ Java client follow.
Examples:
AMQ::Settings.parse_amqp_url("amqp://dev.rabbitmq.com") # => vhost is nil, so default (/) will be used
AMQ::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/") # => vhost is an empty string
AMQ::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/%2Fvault") # => vhost is /vault
AMQ::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/production") # => vhost is production
AMQ::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/a.b.c") # => vhost is a.b.c
AMQ::Settings.parse_amqp_url("amqp://dev.rabbitmq.com/foo/bar") # => ArgumentErrorAMQ::Protocol::TLS_PORT is a new constant that contains default AMQPS 0.9.1 port,
5671.