v2.15.0

vadimdemedes/inkv2.15.0Sep 17, 2026by github-actions[bot]

Upgrading?

AI Summary

NATS Server v2.15.0 brings major JetStream improvements including a desired state metalayer, stream backup v2, and performance enhancements like QoS 1 pipelining.

Key Highlights

  • JetStream desired state metalayer
  • Stream backup and restore v2
  • Stream source indexing
  • QoS 1 pipelining for increased throughput
  • Default limit of 1000 consumers for streams

Breaking Changes

  • Streams now have a default limit of 1000 consumers
  • The `js_raft_delete_range` feature is now enabled by default

New Features

  • JetStream desired state metalayer
  • Stream backup and restore v2
  • Stream source indexing
  • QoS 1 pipelining for increased throughput
  • Default limit of 1000 consumers for streams

Full Release Notes

## Changelog

Refer to the [2.15 Upgrade Guide](https://docs.nats.io/release-notes/upgrade-to-2.15) for backwards compatibility notes with 2.14.x. This release also contains all changes up to and including [v2.14.7](https://github.com/nats-io/nats-server/releases/tag/v2.14.7).

### Go Version

- 1.27.1 (#8551)

### Added

JetStream

- Desired state metalayer (#8432, #8437, #8439, #8443, #8452, #8460, #8476, #8576, #8598, #8602, #8603)
  - A new desired state reconciliation engine for streams and consumers considerably improves the safety and reliability of asset moves and scales
  - Updating the placement or replication factor midway through an existing scale/move operation, cancelling an in-flight scale/move, or peer-removing is now much safer
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md
- Cancel stream move endpoint (#8476)
  - An in-flight scale/move operation on a stream can be cancelled and the asset returned to its original placement using the new `$JS.API.STREAM.CANCEL_MOVE` endpoint
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md
- Evacuate endpoints (#8443)
  - The new `$JS.API.SERVER.EVACUATE` endpoint can safely evacuate streams, and any consumers on those streams, from a node
  - The new `$JS.API.STREAM.PEER.EVACUATE.*` endpoint can safely evacuate a peer, and any consumers on that peer, from a stream
  - These operations combined allow for maintenance operations with full transfer of data and state without having to peer-remove first
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-62.md
- Metalayer rescue for disaster recovery (#8408)
  - The new `$JS.API.META.RESCUE` endpoint can temporarily lower the quorum-needed for the metalayer, in order to facilitate the recovery of a system where nodes have been permanently lost and the metalayer cannot reach quorum
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-61.md
- Stream backup and restore v2 (#7882, #8584, #8591, #8604)
  - A new backup format for stream snapshots which reads out per-message rather than per-block
  - The new backup format also now correctly includes non-replicated consumers on follower nodes
  - ADR: https://github.com/nats-io/nats-architecture-and-design/blob/main/adr/ADR-63.md
- Detect source stream recreation (#8384)
  - The server now detects a source stream being recreated, restarting the sourcing back from the beginning, ensuring new messages are sourced
- Stream source indexing (#8282, #8516, #8283)
  - Restarts and leader changes previously required expensive backward scans through the stream to find the last sourced indices. These are now persisted in an index for instant lookup.
- Domain-prefixed JS API in system account (#8429)
  - When a system account is bridged between the hub and a leaf node, the domain-prefixed JS API can now be used to operate on the leaf node while directly connected to the hub

### Changed

JetStream

- Streams now have a default limit of 1000 consumers, unless `max_consumers` is specified in the stream config or account limits (#8337, #8566)
  - Applications planning to use a large number of consumers on a stream should configure `max_consumers` in the stream config or account limits to an appropriately high number
  - The server-wide default of 1000 can be overridden by setting `default_max_consumers` in the JetStream limits, or can be disabled by setting to `-1`
  - This limit does not affect existing consumers and will not result in consumer deletions, only the creation of new consumers is prevented
- Sync changes for replicated streams (#8447)
  - When the `sync_interval` is set to `always`, replicated streams now sync their WAL entries but no longer sync upper stream layer writes
  - The synced log allows the stream to recover safely, but removing unnecessary syncs from the upper stream layer dramatically improves performance
  - Non-replicated R1 streams are not affected by this change and will continue to sync at the stream layer as normal
- The `js_raft_delete_range` feature is now enabled by default (#8520)

Leafnodes

- The `no_advertise` option no longer includes the hub's own listener address (#8451, contributed by @freakes)

### Improved

JetStream

- Shorter wait for durable source/mirror consumer resets (#8323)
  - When using durable consumers for sourcing or mirroring, the heartbeats now short-circuit the recreation backoff
- An atomic batch for a single-replica stream run with `sync: always` now syncs messages as a group (#8539, contributed by @RainyPixel)
- JetStream source/mirror reply subjects can now opt-in to be domain/account aware (#8586, contributed by @ayushk-1801)

MQTT

- QOS 1 published into JetStream are pipelined for increased throughput (#8415, contributed by @levb)

### Fixed

Leafnodes

- Leafnode isolation using `request_isolation`, or with hub-enforced `isolate`, now works correctly across cluster nodes (#8504)

### Complete Changes
 
https://github.com/nats-io/nats-server/compare/v2.14.7...v2.15.0

Related Repositories