|
| 1 | +## Highlights |
| 2 | + |
| 3 | +This release improves efficiency of quorum and classic queues. Per-queue memory footprint was reduced for some |
| 4 | +workloads. |
| 5 | + |
| 6 | +It also introduces message TTL support for quorum queues. |
| 7 | + |
| 8 | +## Obtaining Packages |
| 9 | + |
| 10 | +RabbitMQ releases are distributed via [GitHub](https://github.com/rabbitmq/rabbitmq-server/releases), [Cloudsmith](https://cloudsmith.io/~rabbitmq/repos/), and [PackageCloud](https://packagecloud.io/rabbitmq). |
| 11 | + |
| 12 | + |
| 13 | +### Erlang/OTP Compatibility Notes |
| 14 | + |
| 15 | +This release [requires Erlang 23.2](https://www.rabbitmq.com/which-erlang.html) or later. Erlang 24 is recommended as it [offers 20%-50% throughput improvements](https://blog.rabbitmq.com/posts/2021/03/erlang-24-support-roadmap/) for many workloads. |
| 16 | + |
| 17 | +[Provisioning Latest Erlang Releases](https://www.rabbitmq.com/which-erlang.html#erlang-repositories) explains what package repositories and tools can be used to provision latest patch versions of Erlang 23.3.x and 24.x. |
| 18 | + |
| 19 | + |
| 20 | + |
| 21 | +## Upgrading to 3.10 |
| 22 | + |
| 23 | +See the [Upgrading guide](https://www.rabbitmq.com/upgrade.html) for documentation on upgrades and [RabbitMQ change log](https://www.rabbitmq.com/changelog.html) for release notes of other releases. |
| 24 | + |
| 25 | +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 |
| 26 | +upgrade to 3.10.0 or any other patch release in the series. |
| 27 | + |
| 28 | +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. |
| 29 | +Once all nodes are upgraded to 3.10.0, these irregularities will go away. |
| 30 | + |
| 31 | +Mixed version clusters are a mechanism that allows rolling upgrade and are not meant to be run for extended |
| 32 | +periods of time (no more than a few hours). |
| 33 | + |
| 34 | + |
| 35 | + |
| 36 | +## Compatibility Notes |
| 37 | + |
| 38 | +### Client Library Compatibility |
| 39 | + |
| 40 | +Client libraries that were compatible with RabbitMQ `3.9.x` will be compatible with `3.10.0`. |
| 41 | + |
| 42 | + |
| 43 | +### Upgrading to Erlang 24.x |
| 44 | + |
| 45 | +RabbitMQ `3.8.16` and later require Erlang `23.2` and support Erlang `24` (recommended). |
| 46 | +Users of RabbitMQ versions that [do not support Erlang 23.2](https://www.rabbitmq.com/which-erlang.html) should first upgrade to the latest `3.8.x` patch release on Erlang 23.2, |
| 47 | +then upgrade to `3.10.0`, and ideally Erlang 24. |
| 48 | + |
| 49 | + |
| 50 | +### Getting Help |
| 51 | + |
| 52 | +Any questions about this release, upgrades or RabbitMQ in general are welcome on the [RabbitMQ mailing list](https://groups.google.com/forum/#!forum/rabbitmq-users). |
| 53 | + |
| 54 | + |
| 55 | + |
| 56 | +## Changes Worth Mentioning |
| 57 | + |
| 58 | +Release notes are kept under [rabbitmq-server/release-notes](https://github.com/rabbitmq/rabbitmq-server/tree/v3.10.x/release-notes). |
| 59 | + |
| 60 | + |
| 61 | +### Core Server |
| 62 | + |
| 63 | +#### Enhancements |
| 64 | + |
| 65 | + * Reduced memory footprint of quorum queues. Quorum queues now move enqueues messages to disk as quickly as |
| 66 | + possible, ignoring the `x-max-in-memory-length` and `x-max-in-memory-bytes` policy keys. This reduces per-queue memory footprint |
| 67 | + and makes throughput and latency less variable. |
| 68 | + |
| 69 | + GitHub issue: [#3898](https://github.com/rabbitmq/rabbitmq-server/issues/3898) |
| 70 | + |
| 71 | + * New classic queue index and message store implementations. This makes memory footprint of classic queues less variable |
| 72 | + and on average, lower than before. Consumer delivery is more efficient, potentially increasing throughput for workloads |
| 73 | + where consumers do keep up with producers. |
| 74 | + |
| 75 | + This implementation is not enabled by default. It can be enabled using a policy: |
| 76 | + |
| 77 | + ``` shell |
| 78 | + rabbitmqctl set_policy cq_version "^cq\." '{"queue-version": 2}' --priority 1 --apply-to queues |
| 79 | + ``` |
| 80 | + |
| 81 | + or set via `rabbitmq.conf`: |
| 82 | + |
| 83 | + ``` ini |
| 84 | + classic_queue.default_version = 2 |
| 85 | + ``` |
| 86 | + GitHub issue: [#3029](https://github.com/rabbitmq/rabbitmq-server/pull/3029) |
| 87 | + |
| 88 | + * Quorum queues now support [message TTL](https://rabbitmq.com/ttl.html). |
| 89 | + |
| 90 | + GitHub issue: [#3121](https://github.com/rabbitmq/rabbitmq-server/pull/3121) |
| 91 | + |
| 92 | + * Reduced per-queue garbage collection. |
| 93 | + |
| 94 | + GitHub issue: [#4110](https://github.com/rabbitmq/rabbitmq-server/pull/4110) |
| 95 | + |
| 96 | + * Stream replication connections now adopt [TLS settings configured for inter-node communication links](https://rabbitmq.com/clustering-ssl.html). |
| 97 | + |
| 98 | + GitHub issue: [#3553](https://github.com/rabbitmq/rabbitmq-server/pull/3553) |
| 99 | + |
| 100 | + * Quorum queues now support two [dead lettering](https://rabbitmq.com/dlx.html) strategies, at-most-once (the 3.9 quorum queue and classic queue behavior) |
| 101 | + and at-least-once. |
| 102 | + |
| 103 | + To use at-least-once the user must opt-in. |
| 104 | + |
| 105 | + GitHub issue: [#3100](https://github.com/rabbitmq/rabbitmq-server/issues/3100) |
| 106 | + |
| 107 | + * Messages delivered by a quorum queue and negatively acknowledged with a requeue will be added to the back of the queue |
| 108 | + until the queue has redelivery limit set. With a redelivery limit, requeueing will use the original position of the message |
| 109 | + if possible. |
| 110 | + |
| 111 | + This improves operational safety: consumers that get stuck or requeue deliveries at a high rate will not indefinitely |
| 112 | + grow quorum queue Raft log, potentially driving the node out of disk space. |
| 113 | + |
| 114 | +  This is a **potentially breaking change**. |
| 115 | + Applications can make sure quorum queues have a redelivery limit |
| 116 | + set if the original behavior is important to keep. |
| 117 | + |
| 118 | + GitHub issue: [#3776](https://github.com/rabbitmq/rabbitmq-server/issues/3776) |
| 119 | + |
| 120 | + * [Boot time definition sync](https://rabbitmq.com/definitions.html#import-on-boot) now can be skipped if definition source (e.g. file or directory) contents |
| 121 | + have not changed: |
| 122 | + |
| 123 | + ``` ini |
| 124 | + definitions.skip_if_unchanged = true |
| 125 | + |
| 126 | + definitions.import_backend = local_filesystem |
| 127 | + definitions.local.path = /path/to/definitions/defs.json |
| 128 | + ``` |
| 129 | + |
| 130 | + GitHub issue: [#4062](https://github.com/rabbitmq/rabbitmq-server/pull/4062) |
| 131 | + |
| 132 | + * Classic mirrored queues peak eager sync throughput now can be limited. |
| 133 | + |
| 134 | + Contributed by @thuandb (AWS). |
| 135 | + |
| 136 | + GitHub issue: [#3925](https://github.com/rabbitmq/rabbitmq-server/pull/3925) |
| 137 | + |
| 138 | + * Headers exchanges (AMQP 0-9-1) now support a new matching strategy, `"any-with-x"`, |
| 139 | + which works the same way as `"any"` but also considers headers that begin with |
| 140 | + an `"x-"`. |
| 141 | + |
| 142 | + GitHub issue: [#4143](https://github.com/rabbitmq/rabbitmq-server/pull/4143) |
| 143 | + |
| 144 | + * Queues can no longer be created in a vhost while deletion of that vhost is in progress |
| 145 | + |
| 146 | + Contributed by @tomyouyou. |
| 147 | + |
| 148 | + GitHub issue: [#4260](https://github.com/rabbitmq/rabbitmq-server/pull/4260) |
| 149 | + |
| 150 | + * rabbitmqctl encode/decode can now accept more values via standard input |
| 151 | + |
| 152 | + GitHub issue: [#4258](https://github.com/rabbitmq/rabbitmq-server/pull/4258) |
| 153 | + |
| 154 | + * rabbitmq_tracing now uses local time for timestamps |
| 155 | + |
| 156 | + GitHub issue: [#4277](https://github.com/rabbitmq/rabbitmq-server/pull/4277) |
| 157 | + |
| 158 | + |
| 159 | +#### Internal API and Other Changes |
| 160 | + |
| 161 | + * Two rarely used classic queue metrics have been removed. Their removal reduces pressure |
| 162 | + on internal table writes and boosts classic queue v1 throughput by 10 to 20 percent. |
| 163 | + |
| 164 | + Contributed by @felixhuettner. |
| 165 | + |
| 166 | + GitHub issue: [#4431](https://github.com/rabbitmq/rabbitmq-server/pull/4431) |
| 167 | + |
| 168 | + * Tracing and `idle_since` timestamps now reflect local time in RFC 3339 format. Previously |
| 169 | + a custom format was used for these timestamps and they always reflected UTC time. |
| 170 | + |
| 171 | + GitHub issue: [#4276](https://github.com/rabbitmq/rabbitmq-server/pull/4276) |
| 172 | + |
| 173 | + * Inter-node message transfer is optimized for the case where a message is only routed to one queue. |
| 174 | + |
| 175 | + Contributed by @tomyouyou. |
| 176 | + |
| 177 | + GitHub issue: [#3865](https://github.com/rabbitmq/rabbitmq-server/pull/3865) |
| 178 | + |
| 179 | + * Definition import now can be extended to support arbitrary sources. This is done |
| 180 | + by providing a module that implements three functions: `is_enabled/0`, `load/1`, `load_with_hashing/3`. |
| 181 | + The module can then should be specified as the `definitions.import_backend` value: |
| 182 | + |
| 183 | + ``` ini |
| 184 | + definitions.import_backend = rabbit_definitions_import_our_custom_backend |
| 185 | + ``` |
| 186 | + |
| 187 | + GitHub issue: [#3311](https://github.com/rabbitmq/rabbitmq-server/pull/3311) |
| 188 | + |
| 189 | + |
| 190 | + * Elixir 1.13 is now supported at build time. |
| 191 | + |
| 192 | + GitHub issue: [#4108](https://github.com/rabbitmq/rabbitmq-server/pull/4108) |
| 193 | + |
| 194 | + |
| 195 | +#### Bug Fixes |
| 196 | + |
| 197 | +This release includes all applicable [bug fixes that shipped in `3.9.x` releases](https://www.rabbitmq.com/changelog.html). |
| 198 | + |
| 199 | + * Addressed a performance regression for large fanouts when streams were not enabled. |
| 200 | + |
| 201 | + GitHub issue: [#4073](https://github.com/rabbitmq/rabbitmq-server/pull/4073) |
| 202 | + |
| 203 | + * Stream delivery rate could drop if concurrent stream consumers consumed in a way |
| 204 | + that made them reach the end of the stream often. |
| 205 | + |
| 206 | + GitHub issue: [#4371](https://github.com/rabbitmq/rabbitmq-server/pull/4371) |
| 207 | + |
| 208 | + * Channels could confirm a subset of messages published as mandatory in some cases. |
| 209 | + |
| 210 | + GitHub issue: [#3870](https://github.com/rabbitmq/rabbitmq-server/pull/3870) |
| 211 | + |
| 212 | + * Direct Erlang client initialisation had a race condition with earlier boot steps, |
| 213 | + which could lead plugins that depend on it to fail to open connections. |
| 214 | + |
| 215 | + GitHub issue: [#3685](https://github.com/rabbitmq/rabbitmq-server/pull/3685) |
| 216 | + |
| 217 | + * Exclusive queues are always placed on local node. |
| 218 | + |
| 219 | + [Exclusive queues](https://rabbitmq.com/queues.html#exclusive-queues) are by definition node-local because they are tied to the lifecycle of |
| 220 | + their declaring connection, which is node-local. |
| 221 | + |
| 222 | + GitHub issue: [#3341](https://github.com/rabbitmq/rabbitmq-server/pull/3341) |
| 223 | + |
| 224 | + |
| 225 | +### Prometheus Plugin |
| 226 | + |
| 227 | +#### Bug Fixes |
| 228 | + |
| 229 | + * Prometheus collector could run into an exception early on node's |
| 230 | + schema database sync. |
| 231 | + |
| 232 | + GitHub issue: [#4376](https://github.com/rabbitmq/rabbitmq-server/pull/4376) |
| 233 | + |
| 234 | + |
| 235 | +### Management Plugin |
| 236 | + |
| 237 | +#### Enhancements |
| 238 | + |
| 239 | + * `idle_since` field now uses RFC 3339 format. |
| 240 | + |
| 241 | +  This is a **potentially breaking change**. |
| 242 | + Sample value with the previous format: `2022-03-22 11:39:37`. With the new format: `2022-03-22T11:39:37.908+01:00`. |
| 243 | + Clients of the REST API should be able to parse values in the new format. |
| 244 | + |
| 245 | + GitHub issue: [#4276](https://github.com/rabbitmq/rabbitmq-server/issues/4276) |
| 246 | + |
| 247 | +#### Bug Fixes |
| 248 | + |
| 249 | + * `rabbitmqadmin` now correctly loads TLS-related keys from its configuration file. |
| 250 | + |
| 251 | + Contributed by @fwolfsjaeger. |
| 252 | + |
| 253 | + GitHub issue: [#4408](https://github.com/rabbitmq/rabbitmq-server/pull/4408) |
| 254 | + |
| 255 | + |
| 256 | +### MQTT Plugin |
| 257 | + |
| 258 | +#### Enhancements |
| 259 | + |
| 260 | + * Durable (QoS 1) subscriptions now can be backed by [quorum queues](https://www.rabbitmq.com/quorum-queues.html) if configured so. |
| 261 | + |
| 262 | + This setting **can only be applied for new clusters**: existing durable classic |
| 263 | + queues will not be converted. Enabling this setting in a cluster with existing |
| 264 | + durable subscription data of MQTT clients will make it impossible for them to |
| 265 | + subscribe without **explicit queue deletion** by the cluster operator. |
| 266 | + |
| 267 | + To opt in to use quorum queues for durable MQTT subscriptions, use the `mqtt.durable_queue_type` |
| 268 | + configuration key in `rabbitmq.conf`: |
| 269 | + |
| 270 | + ``` ini |
| 271 | + mqtt.durable_queue_type = quorum |
| 272 | + ``` |
| 273 | + |
| 274 | + GitHub issue: [#4401](https://github.com/rabbitmq/rabbitmq-server/pull/4401) |
| 275 | + |
| 276 | + |
| 277 | +### OAuth 2 AuthN and AuthZ Backend Plugin |
| 278 | + |
| 279 | +#### Enhancements |
| 280 | + |
| 281 | + * Improvements to JKW support and new HTTPS settings. |
| 282 | + |
| 283 | + Contributed by @anhanhnguyen (Erlang Solutions). |
| 284 | + |
| 285 | + GitHub issue: [#3887](https://github.com/rabbitmq/rabbitmq-server/pull/3887) |
| 286 | + |
| 287 | + |
| 288 | +### Shovel Plugin |
| 289 | + |
| 290 | +#### Enhancements |
| 291 | + |
| 292 | + * Dynamic Shovels can be deleted or restarted from any cluster node |
| 293 | + |
| 294 | + Contributed by @kostakal. |
| 295 | + |
| 296 | + GitHub issue: [#4242](https://github.com/rabbitmq/rabbitmq-server/pull/4242) |
| 297 | + |
| 298 | +#### Bug Fixes |
| 299 | + |
| 300 | + * Shovels with automatic deletion threshold of `0` are now correctly deleted immediately. |
| 301 | + |
| 302 | + Contribited by @luos (Erlang Solutions). |
| 303 | + |
| 304 | + GitHub issue: [#4098](https://github.com/rabbitmq/rabbitmq-server/pull/4098) |
| 305 | + |
| 306 | + |
| 307 | +### Consul Peer Discovery Plugin |
| 308 | + |
| 309 | +#### Bug Fixes |
| 310 | + |
| 311 | + * Handle a response code change in Consul 1.11. |
| 312 | + |
| 313 | + Contributed by @maestroes. |
| 314 | + |
| 315 | + GitHub issue: [#4149](https://github.com/rabbitmq/rabbitmq-server/issues/4149) |
| 316 | + |
| 317 | + |
| 318 | +### Dependency Changes |
| 319 | + |
| 320 | + * `ra` upgraded from [`2.0.0` to `2.0.7`](https://github.com/rabbitmq/ra/compare/v2.0.0...v2.0.7) |
| 321 | + * `osiris` upgraded from [`1.0.0` to `1.2.4`](https://github.com/rabbitmq/osiris/compare/v1.0.0...v1.2.4) |
| 322 | + * `ranch` upgraded from [`2.0.0` to `2.1.0`](https://github.com/ninenines/ranch/compare/2.0.0...2.1.0) |
| 323 | + * `prometheus` upgraded from [`4.8.1` to `4.8.2`](https://github.com/deadtrickster/prometheus.erl/compare/06425c21a39c1564164f1cc3fe5bdfa8b23b1f78...v4.8.2) |
| 324 | + * `eetcd` upgraded from [`0.3.3` to `0.3.5`](https://github.com/zhongwencool/eetcd/compare/v0.3.3...v0.3.5) |
| 325 | + * `observer_cli` upgraded from [`1.6.2` to `1.7.2`](https://github.com/zhongwencool/observer_cli/compare/1.6.2...1.7.2) |
| 326 | + * `gen_batch_server` upgraded from [`0.8.6` to `0.8.7`](https://github.com/rabbitmq/gen-batch-server/compare/38191672ee0f22a8d5291c6c09f8c07178d565ca...v0.8.7) |
0 commit comments