NATS is an open source, lightweight, high-performance cloud native infrastructure messaging system. It implements a highly scalable and elegant publish-subscribe (pub/sub) distribution model. The performant nature of NATS make it an ideal base for building modern, reliable, scalable cloud native distributed systems.
NATS is offered in two interoperable modules: core NATS (referred to simply as "NATS" or "NATS Server" throughout this site), and NATS Streaming, an event streaming service that can be employed to add event streaming, delivery guarantees, and historical data replay to NATS.
NATS was created by Derek Collison, who has over 25 years of experience designing, building, and using publish-subscribe messaging systems. NATS is maintained by an amazing Open Source Ecosystem, find more at GitHub.
NATS stands for Neural Autonomic Transport System. Derek Collison conceived NATS as a messaging platform that functions like a central nervous system.
NATS Streaming is also known as STAN, which is just NATS backward. NATS is at-most-once QoS messaging with no persistence, whereas NATS Streaming is at-least-once QoS, therefore, representing the opposite of NATS.
The NATS server (
nats-server) is written in Go. There is client support for a wide variety of languages. Please see the Download page for more info.
NATS is maintained by a select group of Maintainers following a Governance process as part of the Cloud Native Computing Foundation (CNCF). The team of engineers at Synadia in conjunction with Community Maintainers, maintain the NATS server, NATS Streaming Server, as well as the official Go, Ruby, Node.js, C, C#, Java and several other client libraries. Our very active user community also contributes client libraries and connectors for several other implementation languages. Please see the download page for the complete list, and links to the relevant source repositories and documentation.
Please see the Download page for the latest list of Synadia and Community maintained NATS clients.
Publish() sends a message to
nats-server with a subject as its address, and
nats-server delivers the message to any interested/eligible subscriber of that subject. Optionally, you may also send along a reply subject with your message, which provides a way for subscribers who have received your message(s) to send messages back to you.
Request() is simply a convenience API that does this for you in a pseudo-synchronous fashion, using a timeout supplied by you. It creates an INBOX (a type of subject that is unique to the requestor), subscribes to it, then publishes your request message with the reply address set to the inbox subject. It will then wait for a response, or the timeout period to elapse, whichever comes first.
Yes. NATS is a publish and subscribe system that also has distributed queueing functionality on a per subscriber basis. When you publish a message, for instance at the beginning of a request, every subscriber will receive the message. If subscribers form a queue group, only one subscriber will be picked at random to receive the message. However, note that the requestor does not know or control this information. What the requestor does control is that it only wants one answer to the request, and NATS handles this very well by actively pruning the interest graph.
NATS can be deployed to have an HTTP(s) monitoring port - see the demo server here: http://demo.nats.io:8222/. Alternately, there are several options available, including some from the active NATS community:
Prometheus NATS Exporter Use Prometheus to configure metrics and Grafana to create a visual display.
nats-top A top-like monitoring tool developed by Wally Quevedo of Synadia.
natsboard A monitoring tool developed by Fatih Cetinkaya.
nats-mon A monitoring tool developed by Raül Pérez and Adrià Cidre.
A more detailed overview of monitoring is available under NATS Server Monitoring.
The term 'queueing' implies different things in different contexts, so we must be careful with its use. NATS implements non-persistent distributed queuing via subscriber queue groups. Subscriber queue groups offer a form of message-distribution load balancing. Subject subscriptions in NATS may be either 'individual' subscriptions or queue group subscriptions. The choice to join a queue group is made when the subscription is created, by supplying an optional queue group name. For individual subject subscribers,
nats-server will attempt to deliver a copy of every message published to that subject to every eligible subscriber of that subject. For subscribers in a queue group,
nats-server will attempt to deliver each successive message to exactly one subscriber in the group, chosen at random.
This form of distributed queueing is done in real time, and messages are not persisted to secondary storage. Further, the distribution is based on interest graphs (subscriptions), so it is not a publisher operation, but instead is controlled entirely by
NATS maintains and constantly updates the interest graph (subjects and their subscribers) in real time. Do not think of it as a "directory" that is aggregated over time. The interest graph is dynamic, and will change constantly as publishers and subscribers come and go.
If you are determined to gather this information, it can be indirectly derived at any instant in time by polling the monitoring endpoint for /connz and /routez. See Server Monitoring for more information.
Yes. The valid wildcards are as follows:
The dot character
'.' is the token separator.
The asterisk character
'*' is a token wildcard match.
e.g foo.* matches foo.bar, foo.baz, but not foo.bar.baz.
The greater-than symbol
'>' is a full wildcard match.
e.g. foo.> matches foo.bar, foo.baz, foo.bar.baz, foo.bar.1, etc.
‘Verbose’ means all protocol commands will be acked with a +OK or -ERR. If verbose is off, you don't get the +OK for each command. Pedantic means the server does lots of extra checking, mostly around properly formed subjects, etc. Verbose mode is ON by default for new connections; most client implementations disable verbose mode by default in their INFO handshake during connection.
NATS implements source ordered delivery per publisher. That is to say, messages from a given single publisher will be delivered to all eligible subscribers in the order in which they were originally published. There are no guarantees of message delivery order amongst multiple publishers.
NATS does have a message size limitation that is enforced by the server and communicated to the client during connection setup. Currently, the limit is 1MB.
No. As of
nats-server v0.8.0, there is no hard limit on the maximum number of subjects.
NATS Core Server, simply referred to as NATS Server, offers "at-most-once" delivery. This means messages are guaranteed to arrive intact, in order from a given publisher, but not across different publishers. NATS does everything required to remain available and provide a dial-tone. However, if a subscriber is problematic or goes offline it will not receive messages, as the basic NATS platform is a simple pub-sub transport system that offers only TCP reliability.
As of NATS Server 2.2, NATS JetStream offers persistence as "at-least-once" delivery. See the JetStream documentation for detailed information.
NATS JetStream offers message store and replay by time or sequence.
To gracefully shutdown an asynchronous subscriber so that any outstanding MsgHandlers have a chance to complete outstanding work, call sub.Unsubscribe(). There is a Go routine per subscription. These will be cleaned up on Unsubscribe(), or upon connection teardown.
Subjects are created and pruned (deleted) dynamically based on interest (subscriptions). This means that a subject does not exist in a NATS cluster until a client subscribes to it, and the subject goes away after the last subscribing client unsubscribes from that subject.
Yes, any channel limit will be applied on startup. For more information, see Store Limits.
NATS 2.0 is completely backwards compatible with NATS < 2.x configure files and clients. Just run the new server. Be sure to review the What's New in 2.0 for great new features.
The default setting for a single server is 65,536. Although there is no specified limit to the number of connections supported by NATS, there are some environmental factors that will influence your decision as to how many connections to allow per server.
Most systems can handle several thousand NATS connections per server without any changes although some have a very low default such as OS X. You'll want to look at kernel/OS settings to increase that limit. You'll also want to look at default TCP buffer sizes to best optimize your machine for your traffic characteristics.
If you are using TLS you'll want to be sure the hardware can handle the CPU load created by TLS negotiation when there is the thundering herd of inbound connections after an outage or network partition event. This often overlooked factor is usually the constraint limiting the number of connections a single server should support. Choosing a cipher suite that is supported by TLS acceleration can mitigate this (e.g. AES with x86). Thinking of the entire system, you'll also want to look at a range of reconnect delay times or add reconnect jitter to the NATS clients to even out the distribution of connection attempts over time and reduce CPU spikes.
All said, each server can be tuned to handle a large number of clients, and given the flexibility and scalability of NATS with clusters, superclusters, and leaf nodes one can build a NATS deployment supporting many millions of connections.