Releases: cloudamqp/lavinmq
v2.5.2
Fixed
- Prevent MFile leakage in clustering when follower disconnects #1450
- Don't keep FDs open for MFiles #1428
- Signal empty after purge all in Priority queue message store #1442
- Only render exchange info once #1447
- Add tooltips to exchange features #1448
- Remove NoopServer from Clustering::Server #1457
- GUI: Navigate between exchanges #1454
v2.5.1
This patch release contains some important bugfixes.
Fixed
v2.5.0
LavinMQ 2.5.0 Release Notes
This release focuses on performance improvements, clustering enhancements, and better user experience. This release includes several optimizations that make LavinMQ faster to start, faster to replicate, and easier to use.
Release Highlights
Faster Startups (Meta Files)
LavinMQ now stores message counts in meta files alongside each message segment. Startup times are dramatically reduced, especially if you have large queues or many queues. This change is particularly noticeable on systems with lots of messages. #1163
Faster Cluster Synchronization
Cluster followers now synchronize with the leader much faster thanks to file checksum caching. Checksums are now cached and reused, reducing the time it takes for a follower to catch up or for a new node to join a cluster. This means less downtime during cluster operations and faster recovery scenarios. #1088
Better UI Navigation
The web interface has received a major refresh:
- Light mode - You can now switch between dark and light themes 46b00e4c
- New sidebar menu - reorganized with icons and logical groupings for easier navigation #1268
- Updated log view - sticky headers make it easier to browse logs #1333, and you can now search tables as you type #1274
- Various small improvements to forms, tables, and responsive design
MQTT 3.1.0 Support
We've added support for MQTT 3.1.0 protocol alongside the existing 3.1.1 support.
Breaking Changes
Metrics - messages_ready, messages_unacknowledged
Queue metrics have been renamed for consistency:
ready→messages_readyready_bytes→message_bytes_readyunacked→messages_unacknowledgedunacked_bytes→message_bytes_unacknowledged
The old names still work in 2.5.0 but will be removed in 3.0.0. #1121
Important Bugfixes
Topic Exchange Routing
Fixed a bug where topic exchanges sometimes didn't route messages properly when using wildcard routing keys. #1300
MQTT Client Reconnection with Unacked Messages
MQTT clients with unacknowledged messages were sometimes blocked from reconnecting. The fix ensures clients can always reconnect. #1102
Dead Letter Loop Prevention
Fixed a bug that could cause messages to loop infinitely between queues via dead letter exchanges. #1244
Delayed Exchange x-cache-ttl Bug
When using delayed exchanges with deduplication, the x-cache-ttl header was incorrectly reset when messages expired if the ttl and delay was the same. This prevents that from occuring. #1161
Changes Worth Mentioning
lavinmqperf MQTT Support
The lavinmqperf benchmarking tool now supports MQTT. This lets you performance test and stress test your MQTT workloads using the same tooling you use for AMQP. #983
etcd - Support for Basic Auth
Clustering via etcd now supports basic authentication and HTTPS connections. #1212
MQTT Client Permissions
Adds permission checks for publishing and subscribing with MQTT clients. When an MQTT client publishes to a topic, LavinMQ checks write permissions; when subscribing, it checks read/write permissions. #1275
Alpine Linux Support
Adds better support for Alpine Linux. #1115
Shovels Can Now Be Paused and Resumed
You can now pause and resume shovels via the API and UI without deleting and recreating them. The paused state persists across restarts. #1103
Crystal 1.18.0 Compatibility
LavinMQ now builds with Crystal 1.18.0. If you're building from source, make sure to update your Crystal installation. #1356, #1360
Prometheus Metrics on Separate Port
You can now serve Prometheus metrics on a separate port from the main management API. This allows you to expose /metrics for scraping without requiring authentication, while keeping the management API secured. #1217
Followers Serve Their Own /metrics
Follower nodes now serve their own metrics instead of proxying to the leader, making it possible to gather metrics for all nodes in a cluster. #1217
Fairer Message Distribution
Messages are now distributed more fairly among consumers connected to the same queue. Previously, depending on timing and network conditions, some consumers could receive a disproportionate share of messages. The improved algorithm ensures all consumers get a more balanced workload, leading to better throughput and resource utilization. #1173
Federation Respects max-hops
Federation links now properly respect the max-hops parameter. This prevents messages from bouncing between federated clusters indefinitely. #1130
For the full list of changes, see the changelog.
v2.5.0-rc.7
Fixed
- Fixed a bug where LavinMQ could end up in an infinte loop in a priority queue #1420
- Remove meta files after priority queue store migration #1421
- Show all channels for a specific vhost in the GUI #1413
- Don't log 'NaN' during follower sync if bps is 0 #1418
- Fixed a flaky spec #1383
- Add builds for Debian 13 & Fedora 43. Remove builds for Fedora 40 #1410
v2.5.0-rc6
Fixed
- Reset segment pos before producing metadata #1417
2.5.0-rc.5
Fixed
- Remove leftover apostrophe after refactoring #1415
- Don't crash when reading metadata #1416
- Fix x-max-age not showing as effective argument for stream queues in UI #1389
- Add x-hash-on to effective_arguments for Consistent Hash Exchange #1405
- Bugfix: mismatch between ids in view and script #1409
- Exchange view will auto refresh data #1399
- Handle AMQPLAIN authentication without required keys 035b8fdf
- Respect --pmessages/--cmessages also for multiple publishers/consumers in lavinmqperf 03604792
- Only include livereload.js if flag livereloadjs is set #1411
v2.5.0-rc.4
v2.4.5
v2.5.0-rc.3
Added
- MQTT client now uses permissions to authorize write operations on publish and read/write operations on subscribe #1275
Changed
- Crystal 1.18.0 compatibility #1356, #1360
- Sticky header on logs page #1333
- Less scary logging if cleaning up upstream resources fails #1379
Fixed
- UI sorting bugs #1374
- Don't delete shovel with DeleteAfter::QueueLength when pausing it #1376
- Federations: Use correct variable to prevent channel error and reconnect #1378
- Right-aligned columns display in UI tables 97f093e
- Close metrics_server on clustering client close #1367 & #1380
- Replicate meta files in clustering #1365
- Use the right counters for lavinmq_global_messages_delivered_total #1358
v2.5.0-rc.2
Added
- Human friendly exchange type names in controller and exchanges.js #1238
- Icons added to sidebar navigation and divided sidebar into groups #1268
- Table filter: search as you type functionality #1274
- Read messages from stream #1236
- Support Basic Auth and HTTPS for etcd endpoints #1212
- Add checksum verification for JavaScript dependencies #1257
Changed
- Use paused instead of .paused as filename for paused queues #1209
- Use eventListener consistently across JS #1220
- Prometheus metrics can nowbe served on a different port to allow unauthenticated requests for metrics #1217
- Followers no longer forward requests to the unauthenticated
/metricsto leader and instead show their own metrics #1217 - Rename message segment meta files to
meta.SEGMENT#1343 - Switch from slash to chevron right in title bar breadcrumbs #1334
Fixed
list_connections: don't fail on missing key #1226- Fixed bug where proxying from a follower that is performing full sync does not work #1283
- Fix condition if follower should be written to ISR #1341
- Manage shovels on streams in the GUI #1337
- API endpoint should accept empty/no body #1338
- Don't double requeue messages on delivery failure #1344
- Topic exchange doesn't route messages properly #1300
- Specs should fail on closed queues #1339
- Fix for sidebar icons light and dark mode #1329
- Don't allow deletion of default (amq.x / mqtt.x) exchanges #1321
- Allow deleting internal exchange via HTTP #1319
- Make sure unused segments are properly deleted #1297
- Don't return empty messages from first? and shift? #1298
- Fix segfault in purge_all #1289
- Always decode path params #1273
- Move initialization of some BoolChannel to prevent leaks #1263
- Fix some UI bugs in shovels: handle src and dest as arrays, properly display src-exchange, properly show paused/resume state #1265
- Fixed a raise condition in
MFile#close816bfb3 - Reject unacked messages on error when getting messages via HTTP #1349
- Added missing documentation #1304 & #1306