Highlights
This release improves efficiency of quorum and classic queues. Per-queue memory footprint was reduced for some workloads.
It also introduces message TTL support for quorum queues.
Obtaining Packages
RabbitMQ releases are distributed via GitHub, Cloudsmith, and PackageCloud.
Erlang/OTP Compatibility Notes
This release requires Erlang 23.2 or later. Erlang 24 is recommended as it offers 20%-50% throughput improvements for many workloads.
Provisioning Latest Erlang Releases explains what package repositories and tools can be used to provision latest patch versions of Erlang 23.3.x and 24.x.
Upgrading to 3.10
See the Upgrading guide for documentation on upgrades and RabbitMQ change log for release notes of other releases.
RabbitMQ 3.10.0 nodes can run alongside 3.9.x
nodes. 3.10.x
-specific features can only be made available when all nodes in the cluster upgrade to 3.10.0 or any other patch release in the series.
While operating in mixed version mode, some aspects of the system may not behave as expected. The list of known behavior changes is covered below.
Once all nodes are upgraded to 3.10.0, these irregularities will go away.
Mixed version clusters are a mechanism that allows rolling upgrade and are not meant to be run for extended periods of time (no more than a few hours).
Compatibility Notes
Client Library Compatibility
Client libraries that were compatible with RabbitMQ 3.9.x
will be compatible with 3.10.0
.
Upgrading to Erlang 24.x
RabbitMQ 3.8.16
and later require Erlang 23.2
and support Erlang 24
(recommended).
Users of RabbitMQ versions that do not support Erlang 23.2 should first upgrade to the latest 3.8.x
patch release on Erlang 23.2, then upgrade to 3.10.0
, and ideally Erlang 24.
Getting Help
Any questions about this release, upgrades or RabbitMQ in general are welcome on the RabbitMQ mailing list.
Changes Worth Mentioning
Release notes are kept under rabbitmq-server/release-notes.
Core Server
Enhancements
-
Reduced memory footprint of quorum queues. Quorum queues now move enqueues messages to disk as quickly as possible, ignoring the
x-max-in-memory-length
andx-max-in-memory-bytes
policy keys. This reduces per-queue memory footprint and makes throughput and latency less variable.GitHub issue: #3898
-
New classic queue index and message store implementations. This makes memory footprint of classic queues less variable and on average, lower than before. Consumer delivery is more efficient, potentially increasing throughput for workloads where consumers do keep up with producers.
This implementation is not enabled by default. It can be enabled using a policy:
rabbitmqctl set_policy cq_version "^cq\." '{"queue-version": 2}' --priority 1 --apply-to queues
or set via
rabbitmq.conf
:classic_queue.default_version = 2
GitHub issue: #3029
-
Quorum queues now support message TTL.
GitHub issue: #3121
-
Reduced per-queue garbage collection.
GitHub issue: #4110
-
Stream replication connections now adopt TLS settings configured for inter-node communication links.
GitHub issue: #3553
-
Quorum queues now support two dead lettering strategies, at-most-once (the 3.9 quorum queue and classic queue behavior) and at-least-once.
To use at-least-once the user must opt-in.
GitHub issue: #3100
-
Messages delivered by a quorum queue and negatively acknowledged with a requeue will be added to the back of the queue until the queue has redelivery limit set. With a redelivery limit, requeueing will use the original position of the message if possible.
This improves operational safety: consumers that get stuck or requeue deliveries at a high rate will not indefinitely grow quorum queue Raft log, potentially driving the node out of disk space.
This is a potentially breaking change.
Applications can make sure quorum queues have a redelivery limit set if the original behavior is important to keep.GitHub issue: #3776
-
Boot time definition sync now can be skipped if definition source (e.g. file or directory) contents have not changed:
definitions.skip_if_unchanged = true definitions.import_backend = local_filesystem definitions.local.path = /path/to/definitions/defs.json
GitHub issue: #4062
-
Classic mirrored queues peak eager sync throughput now can be limited.
Contributed by @thuandb (AWS).
GitHub issue: #3925
-
Headers exchanges (AMQP 0-9-1) now support a new matching strategy,
"any-with-x"
, which works the same way as"any"
but also considers headers that begin with an"x-"
.GitHub issue: #4143
-
Queues can no longer be created in a vhost while deletion of that vhost is in progress
Contributed by @tomyouyou.
GitHub issue: #4260
-
rabbitmqctl encode/decode can now accept more values via standard input
GitHub issue: #4258
-
rabbitmq_tracing now uses local time for timestamps
GitHub issue: #4277
Internal API and Other Changes
-
Tracing and
idle_since
timestamps now reflect local time in RFC 3339 format. Previously a custom format was used for these timestamps and they always reflected UTC time.GitHub issue: #4276
-
Inter-node message transfer is optimized for the case where a message is only routed to one queue.
Contributed by @tomyouyou.
GitHub issue: #3865
-
Definition import now can be extended to support arbitrary sources. This is done by providing a module that implements three functions:
is_enabled/0
,load/1
,load_with_hashing/3
.
The module can then should be specified as thedefinitions.import_backend
value:definitions.import_backend = rabbit_definitions_import_our_custom_backend
GitHub issue: #3311
-
Elixir 1.13 is now supported at build time.
GitHub issue: #4108
Bug Fixes
This release includes all bug fixes that shipped in 3.9.x
releases.
-
Addressed a performance regression for large fanouts when streams were not enabled.
GitHub issue: #4073
-
Channels could confirm a subset of messages published as mandatory in some cases.
GitHub issue: #3870
-
Direct Erlang client initialisation had a race condition with earlier boot steps, which could lead plugins that depend on it to fail to open connections.
GitHub issue: #3685
-
Exclusive queues are always placed on local node.
Exclusive queues are by definition node-local because they are tied to the lifecycle of their declaring connection, which is node-local.
GitHub issue: #3341
Management Plugin
-
idle_since
field now uses RFC 3339 format.This is a potentially breaking change.
Sample value with the previous format:2022-03-22 11:39:37
. With the new format:2022-03-22T11:39:37.908+01:00
.
Clients of the REST API should be able to parse values in the new format.GitHub issue: #4276
OAuth 2 AuthN and AuthZ Backend Plugin
-
Improvements to JKW support and new HTTPS settings.
Contributed by @anhanhnguyen (Erlang Solutions).
GitHub issue: #3887
Shovel Plugin
Enhancements
-
Dynamic Shovels can be deleted or restarted from any cluster node
Contributed by @kostakal.
GitHub issue: #4242
Bug Fixes
-
Shovels with automatic deletion threshold of
0
are now correctly deleted immediately.Contribited by @luos (Erlang Solutions).
GitHub issue: #4098
Consul Peer Discovery Plugin
Bug Fixes
-
Handle a response code change in Consul 1.11.
Contributed by @maestroes.
GitHub issue: #4149
Dependency Changes
ra
upgraded from2.0.0
to2.0.4
osiris
upgraded from1.0.0
to1.2.4
ranch
upgraded from2.0.0
to2.1.0
observer_cli
upgraded from1.6.2
to1.7.2
gen_batch_server
upgraded from0.8.6
to0.8.7