mrkeyoor.com_
Tue 10 Nov 00:37 UTC
Dataevaluationupdated 24 Oct 2026

nats-server review

NATS Server connects applications through named message subjects. Core NATS delivers live publish-subscribe traffic to connected subscribers without storing messages. JetStream adds persistence, replay, acknowledgments, and key-value and object-store abstractions.

+25stars / 7d
Verdict

Shortlist NATS Server when subject-based service messaging fits your application, then decide explicitly whether messages may disappear or need JetStream persistence. Our October 3, 2026 run at c4eb4fc recorded successful install- and build-labelled steps, but their retained output does not verify an installed CLI or runnable server. The test command failed after 365 seconds with several visible failure categories. Investigate those failures and validate delivery, redelivery, and recovery on your target environment before rollout.

We ran it

Lab card: what happened when we ran nats-serverScreenshot of nats-server (nats.io)
Install✓ · 30s24 packages
Build✓ · 61s
Tests✗ · 365s18 passed · 6 failed of 24 (go test)
Repo598 files~474,543 lines of source · 14.8 MB · 10 CI workflows · tests dir

Answers from our run

Does nats-server build from source?

Dependencies installed in 30 seconds (24 packages), and the build succeeded in 61 seconds. We cloned commit c4eb4fc into a clean Debian container with 3 CPUs and no project-specific setup.

Do nats-server's tests pass?

No. The project's own test command finished in 365 seconds and reported 18 passed, 6 failed (go test).

Who should not use nats-server?

Applications expecting Core NATS alone to retain messages for offline subscribers.

What are the alternatives to nats-server?

RabbitMQ, Apache Kafka. Shortlist NATS Server when subject-based service messaging fits your application, then decide explicitly whether messages may disappear or need JetStream persistence.

Setup2/5The October 3, 2026 run at c4eb4fc recorded successful 30-second install- and 61-second build-labelled steps, but the retained tails do not verify a runnable installation; go test exited 1.
Docs4/5Supplied Core NATS and JetStream documentation explains delivery semantics, configuration, and examples; release notes identify upgrade caveats. Examples were not executed in this review.
Community3/5The README lists contribution and support channels, and supplied issues contain maintainer discussion. Adoption, support responsiveness, and current participation levels were not measured.
Maturity3/5Documented persistence and version guidance support evaluation, but issue #8505 reports a specific recovery defect and the recorded test failures remain undiagnosed.

Discussed on

  1. hnHigh-Performance server for NATS.io, the cloud and edge native messaging system146 points

Who it’s for

Service teams choosing subject-based messaging for live events, request-reply, or shared work.
Applications that can tolerate missed live messages or explicitly configure JetStream for persistence.
Teams prepared to qualify message delivery and recovery behavior on their deployment environment.

Who it’s NOT for

Applications expecting Core NATS alone to retain messages for offline subscribers.
Teams expecting persistence without designing stream storage, retention, replication, consumer acknowledgments, and redelivery handling.
Operators treating a successful setup command or the recorded parser counts as proof of production readiness.
Single-replica JetStream key-value deployments relying on TTL purge behavior without investigating the recovery scenario reported in issue #8505.

Setup reality

In our recorded run on October 3, 2026, at commit c4eb4fc36b73d5bbe4c036babf77776a95abf8fb, the install-labelled step exited successfully in 30 seconds. Its retained output shows a Go 1.26.8 toolchain download; it does not establish that a NATS CLI or server binary was installed. The build-labelled step exited successfully in 61 seconds, but its retained output is only "vet-exit:0", so the record does not establish a compiled, runnable server.

The go test step exited 1 after 365 seconds. The parser recorded 18 passing and 6 failing results, with total 24, and separately recorded 4 packages without test files. These are unreconciled parser summaries, not verified counts of unique tests or exhaustive package coverage. The retained log includes logger, server, and test package failures, authentication-callout and connection-limit test names, and four OCSP test groups with TLS error mismatches. It does not establish their root causes or a security vulnerability.

The recorded sandbox had 3 CPUs, 8 GB of memory, and the image label golang:1.24-bookworm. That label does not establish the runtime toolchain used. The scan recorded 24 dependencies, 598 files, about 474,543 source lines, 14.8 MB, 10 CI workflows, and a tests directory; it found no Dockerfile or Compose file within its scan. No installed-binary check, messaging workload, throughput benchmark, or security audit is recorded.

Core NATS will not hold a message for a subscriber that is offline. That is the first decision to make when evaluating NATS Server: can the application use live delivery, or must messages survive for later consumption?

Choose delivery semantics first

The Core NATS documentation describes subject-based publish-subscribe with at-most-once delivery. Interested subscribers connected at publication receive a copy; an offline or not-yet-subscribed client does not receive it later. Core NATS has no message storage or acknowledgments. The documentation also covers request-reply and queue groups, where one group member receives each message.

That model fits live signals when the next update can replace a missed one. It requires care when a missed event would leave application state incorrect. Decide which messages can be lost before choosing Core NATS alone.

JetStream adds persistence and replay through streams and consumers. Streams capture matching subjects; consumers track progress and acknowledgments. The documentation describes at-least-once delivery and redelivery when an acknowledgment does not arrive in time. Handlers therefore need a plan for repeated delivery, such as idempotent side effects.

JetStream configuration includes memory or disk storage, retention, and replication. Its key-value and object stores build on streams and consumers. These are documented capabilities, not workloads verified by our run.

What our recorded run establishes

Our stored run began on October 3, 2026, at 04:48:26.312 UTC, against commit c4eb4fc36b73d5bbe4c036babf77776a95abf8fb. It used a recorded configuration of 3 CPUs, 8 GB of memory, and image golang:1.24-bookworm. No new execution was performed for this review.

The install-labelled step exited 0 after 29.645 seconds, rounded to 30 seconds in the harness. Its retained tail says "go: downloading go1.26.8 (linux/amd64)". This establishes a toolchain download observation and successful command exit, rather than installation of the separate NATS CLI or an installed server check.

The build-labelled step exited 0 after 60.515 seconds, rounded to 61 seconds. Its retained tail is "vet-exit:0". Without the command text or a binary execution check, that evidence is insufficient to claim a compiled server was produced or started.

The go test step ran for 365.322 seconds and exited 1. Its parser summary records 18 passing and 6 failing results with total 24, plus a separate count of 4 packages without test files. Unique and exhaustive coverage was not verified, and the retained tail contains repeated summary lines. These figures should not be presented as 18 individual tests passing out of 24, or as a reconciled package pass rate. Packages without test files are not failed tests.

Visible failures extend beyond OCSP. The retained output includes a logger package failure alongside a Unix syslog delivery error; server failures naming TestAuthCalloutMultiAccounts, TestAuthCalloutLeafNodeAndConfigMode, and TestSystemAccountConnectionLimitsServersStaggered; and failures in the test package. Four visible OCSP groups expected a TLS bad-certificate error but received a connection-closed error with a broken-pipe write. The tail also contains register output without enough context to diagnose it.

The record supports investigating these failures. It does not show that revoked clients were accepted, establish a security vulnerability, or prove that messaging or JetStream is generally broken. It contains no measured messaging workload, installed-binary check, or security audit.

The repository scan recorded 598 files, approximately 474,543 source lines, 14.8 MB, 24 dependencies, 10 CI workflow files, and a tests directory. No Dockerfile or Compose file appeared in that scan. Those observations describe the scanned checkout, not all distribution options or dependency coverage.

Qualify the persistence path you intend to use

Issue #8505 reports a specific JetStream key-value recovery problem on nats-server v2.14.5 with NATS CLI 0.4.0. In the reporter's single-server, single-replica scenario, a TTL-purged key became readable again after an unclean shutdown and file-store state rebuild. The supplied issue extract shows it open and includes the reporter's workaround of retaining purge markers until older values are physically absent.

We did not reproduce that report. It is relevant qualification evidence for applications relying on that deletion path, rather than proof that every JetStream stream has the same behavior. Before storing authoritative state, test the retention, deletion, restart, and recovery paths your application actually uses.

The supplied v2.14.5 release notes remain relevant version documentation. The measured commit c4eb4fc is a separate identifier; this run should not be described as a test of that release tag.

Check rollout controls at the right level

Issue #6563 proposes paused connections and subscription or connection weights. It is not a complete inventory of routing capabilities. The discussion distinguishes existing subject mapping and weighting from the proposed subscription controls. The Core NATS documentation also describes server-side subject mapping that can split traffic by weight.

If gradual rollout is a requirement, specify whether you need subject-level traffic splitting, subscription weights, or paused delivery. Verify the exact mechanism rather than treating the proposal's open status as evidence that all weighted routing is unavailable.

Alternatives and next step

RabbitMQ's supplied README documents AMQP, MQTT, STOMP, quorum queues, and persistent replicated streams. Evaluate it when those protocols or queue and stream types match your requirements. Apache Kafka's README describes a distributed event streaming platform for pipelines, streaming analytics, and integration. Evaluate it for that role. The supplied extracts do not establish a comparative performance or ease-of-operation winner.

For NATS Server, start by writing down which subjects can tolerate missed messages and which require persistence. Then qualify a pinned release with the client behavior, acknowledgments, redelivery, and recovery procedures you intend to deploy. Obtain complete failure logs before assigning causes to the recorded test failures.

How the ratings work

These are editorial assessments of the supplied evidence, not benchmark results. The scale is 1 for evidence of major obstacles, 2 for substantial unresolved qualification, 3 for a documented basis with material verification gaps, 4 for broad supporting evidence with limited gaps, and 5 for comprehensive evidence across the assessed area. Unknown adoption and compatibility do not earn a high score.

Setup receives 2 because successful step exits do not verify a runnable installation. Documentation receives 4 because the supplied material explains delivery semantics, configuration choices, runnable examples, and version caveats, though we did not execute those examples. Community receives 3 because the README supplies contribution and support channels and the issues show maintainer discussion, without verified adoption or response-time measurements. Maturity receives 3 because persistence and version documentation provide a basis for evaluation, while the reported recovery issue and unresolved local failures require qualification.

Alternatives

ProjectWhat it isPick it when
RabbitMQ gh↗A messaging and streaming broker supporting AMQP, MQTT, STOMP, and the RabbitMQ Stream Protocol.Choose it for evaluation when those protocols or its documented quorum queues and persistent replicated streams match your requirements.
Apache Kafka gh↗A distributed event streaming platform for data pipelines, streaming analytics, and data integration.Choose it for evaluation when your main requirement is an event streaming platform for pipelines, analytics, or integration.

What people are saying

  1. [github-trending] nats-io/nats-server

Sources

  1. NATS Server README
  2. Core NATS documentation
  3. JetStream documentation
  4. NATS Server v2.14.5 release
  5. JetStream purge recovery issue #8505
  6. Core NATS rollout request #6563

More data reviews

rerun · telegraf · rocksdb · redash · akshare · DB-GPT · the whole board →