Skip to content

Tags: cloudamqp/lavinmq

Tags

v2.5.1

Toggle v2.5.1's commit message
[2.5.1] - 2025-11-05

Fixed
- Boolean queue arguments validated as invalid if set to false [#1429](#1429)
- Use the correct path for meta files in streams [#1438](#1438)
- Remove meta files when segments are removed in streams [#1435](#1435)
- Consumers would get stuck trying to consume from priority queues [#1440](#1440)

v2.5.0

Toggle v2.5.0's commit message
This release focuses on performance improvements, clustering enhancem…

…ents, and better user experience. This release includes several optimizations that make LavinMQ faster to start, faster to replicate, and easier to use.

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](#1163)

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](#1088)

The web interface has received a major refresh:
- **Light mode** - You can now switch between dark and light themes [46b00e4](46b00e4c)
- **New sidebar menu** - reorganized with icons and logical groupings for easier navigation [#1268](#1268)
- **Updated log view** - sticky headers make it easier to browse logs [#1333](#1333), and you can now search tables as you type [#1274](#1274)
- Various small improvements to forms, tables, and responsive design

We've added support for MQTT 3.1.0 protocol alongside the existing 3.1.1 support.

Queue metrics have been renamed for consistency:
- `ready` → `messages_ready`
- `ready_bytes` → `message_bytes_ready`
- `unacked` → `messages_unacknowledged`
- `unacked_bytes` → `message_bytes_unacknowledged`

The old names still work in 2.5.0 but will be removed in 3.0.0. [#1121](#1121)

Fixed a bug where topic exchanges sometimes didn't route messages properly when using wildcard routing keys. [#1300](#1300)

MQTT clients with unacknowledged messages were sometimes blocked from reconnecting. The fix ensures clients can always reconnect. [#1102](#1102)

Fixed a bug that could cause messages to loop infinitely between queues via dead letter exchanges. [#1244](#1244)

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](#1161)

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](#983)

Clustering via etcd now supports basic authentication and HTTPS connections. [#1212](#1212)

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](#1275)

Adds better support for Alpine Linux. [#1115](#1115)

You can now pause and resume shovels via the API and UI without deleting and recreating them.  The paused state persists across restarts. [#1103](#1103)

LavinMQ now builds with Crystal 1.18.0. If you're building from source, make sure to update your Crystal installation. [#1356](#1356), [#1360](#1360)

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](#1217)

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](#1217)

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](#1173)

Federation links now properly respect the `max-hops` parameter. This prevents messages from bouncing between federated clusters indefinitely. [#1130](#1130)

---

For the full list of changes, see the [changelog](https://github.com/cloudamqp/lavinmq/blob/main/CHANGELOG.md).

v2.5.0-rc.7

Toggle v2.5.0-rc.7's commit message
[2.5.0-rc.7] - 2025-11-03

Fixed
- Fixed a bug where LavinMQ could end up in an infinte loop in a priority queue [#1420](#1420)
- Remove meta files after priority queue store migration [#1421](#1421)
- Show all channels for a specific vhost in the GUI [#1413](#1413)
- Don't log 'NaN' during follower sync if bps is 0 [#1418](#1418)
- Fixed a flaky spec [#1383](#1383)
- Add builds for Debian 13 & Fedora 43. Remove builds for Fedora 40 [#1410](#1410)

v2.5.0-rc.6

Toggle v2.5.0-rc.6's commit message
- Reset segment pos before producing metadata [#1417](#1417)

v2.5.0-rc.5

Toggle v2.5.0-rc.5's commit message
[2.5.0-rc.5] - 2025-10-30

Fixed
- Remove leftover apostrophe after refactoring [#1415](#1415)
- Don't crash when reading metadata [#1416](#1416)
- Fix x-max-age not showing as effective argument for stream queues in UI [#1389](#1389)
- Add x-hash-on to effective_arguments for Consistent Hash Exchange [#1405](#1405)
- Bugfix: mismatch between ids in view and script [#1409](#1409)
- Exchange view will auto refresh data [#1399](#1399)
- Handle AMQPLAIN authentication without required keys [035b8fd](035b8fdf)
- Respect --pmessages/--cmessages also for multiple publishers/consumers in lavinmqperf [0360479](03604792)
- Only include livereload.js if flag livereloadjs is set [#1411](#1411)

v2.5.0-rc.4

Toggle v2.5.0-rc.4's commit message
[2.5.0-rc.4] - 2025-10-27

Fixed
- Stream Basic Get responses over HTTP API [c1b8ec3](c1b8ec3)
- Fixed a bug where stream consumers sometimes did not flush messages to socket [#1385](#1385)
- Log Info instead of Warning on passive declare [#1384](#1384)
- Log which user is being denied permission [#1392](#1392)

v2.4.5

Toggle v2.4.5's commit message
[2.4.5] - 2025-10-22

Fixed
- Crystal 1.18.x compatibility [#1361](#1361), [#1359](#1359), [#1373](#1373)

v2.5.0-rc.3

Toggle v2.5.0-rc.3's commit message
[2.5.0-rc.3] - 2025-10-21

Added
- MQTT client now uses permissions to authorize write operations on publish and read/write operations on subscribe [#1275](#1275)

Changed
- Crystal 1.18.0 compatibility [#1356](#1356), [#1360](#1360)
- Sticky header on logs page [#1333](#1333)
- Less scary logging if cleaning up upstream resources fails [#1379](#1379)

Fixed
- UI sorting bugs [#1374](#1374)
- Don't delete shovel with DeleteAfter::QueueLength when pausing it [#1376](#1376)
- Federations: Use correct variable to prevent channel error and reconnect [#1378](#1378)
- Right-aligned columns display in UI tables [97f093e](da51e80)
- Close metrics_server on clustering client close [#1367](#1367) & [#1380](#1380)
- Replicate meta files in clustering [#1365](#1365)
- Use the right counters for lavinmq_global_messages_delivered_total [#1358](#1358)

v2.5.0-rc.2

Toggle v2.5.0-rc.2's commit message
[2.5.0-rc.2] - 2025-10-14

Added
- Human friendly exchange type names in controller and exchanges.js [#1238](#1238)
- Icons added to sidebar navigation and divided sidebar into groups [#1268](#1268)
- Table filter: search as you type functionality [#1274](#1274)
- Read messages from stream [#1236](#1236)
- Support Basic Auth and HTTPS for etcd endpoints [#1212](#1212)
- Add checksum verification for JavaScript dependencies [#1257](#1257)

Changed
- Use paused instead of .paused as filename for paused queues [#1209](#1209)
- Use eventListener consistently across JS [#1220](#1220)
- Prometheus metrics can nowbe served on a different port to allow unauthenticated requests for metrics [#1217](#1217)
- Followers no longer forward requests to the unauthenticated `/metrics` to leader and instead show their own metrics [#1217](#1217)
- Rename message segment meta files to `meta.SEGMENT` [#1343](#1343)
- Switch from slash to chevron right in title bar breadcrumbs [#1334](#1334)

Fixed
- `list_connections`: don't fail on missing key [#1226](#1226)
- Fixed bug where proxying from a follower that is performing full sync does not work [#1283](#1283)
- Fix condition if follower should be written to ISR [#1341](#1341)
- Manage shovels on streams in the GUI [#1337](#1337)
- API endpoint should accept empty/no body [#1338](#1338)
- Don't double requeue messages on delivery failure [#1344](#1344)
- Topic exchange doesn't route messages properly [#1300](#1300)
- Specs should fail on closed queues [#1339](#1339)
- Fix for sidebar icons light and dark mode [#1329](#1329)
- Don't allow deletion of default (amq.x / mqtt.x) exchanges [#1321](#1321)
- Allow deleting internal exchange via HTTP [#1319](#1319)
- Make sure unused segments are properly deleted [#1297](#1297)
- Don't return empty messages from first? and shift? [#1298](#1298)
- Fix segfault in purge_all [#1289](#1289)
- Always decode path params [#1273](#1273)
- Move initialization of some BoolChannel to prevent leaks [#1263](#1263)
- Fix some UI bugs in shovels: handle src and dest as arrays, properly display src-exchange, properly show paused/resume state [#1265](#1265)
- Fixed a raise condition in `MFile#close` [816bfb3](816bfb3)
- Reject unacked messages on error when getting messages via HTTP [#1349](#1349)
- Added missing documentation [#1304](#1304) & [#1306](#1306)

v2.4.4

Toggle v2.4.4's commit message
[2.4.4] - 2025-09-16

Fixed
- Memory leak in StreamConsumer [#1266](#1266)
- Fixed some UI bugs [#1269](#1269)
- Prevent delayed exchanges to bind to its internal delayed queue [#1270](#1270)