image source: https://nats.io/ |
Background Reading
Neural Autonomic Transport System (NATS)- NATS is an open-source messaging system (sometimes called message-oriented middleware).
- The NATS server is written in the Go programming language.
- Client libraries to interface with the server are available for dozens of major programming languages. The core design principles of NATS are performance, scalability, and ease of use.
- NATS was originally developed by Derek Collison as the messaging control plane for Cloud Foundry and was written in Ruby. NATS was later ported to Go.
- Microservices frameworks such as Micro, Mainflux, and Hemera rely on NATS as their messaging backbone.
NATS Documentation
- Secure by default communications for microservices, edge platforms and devices
- Secure multi-tenancy in a single distributed communication technology
- Transparent location addressing and discovery
- Resiliency with an emphasis on the overall health of the system
- Ease of use for agile development, CI/CD, and operations, at scale
- Highly scalable and performant with built-in load balancing and dynamic auto-scaling
- Consistent identity and security mechanisms from edge devices to backend services
Support for Observable and Scalable Services and Event/Data Streams
Cloud Native, a CNCF project with Kubernetes and Prometheus integrations
NATS Streaming is also known as STAN, which is just NATS backward
Use Cases:
- Cloud Messaging
- Services (microservices, service mesh)
- Event/Data Streaming (observability, analytics, ML/AI)
- Command and Control
- IoT and Edge
- Telemetry / Sensor Data / Command and Control
- Augmenting or Replacing Legacy Messaging Systems
"While the NATS server has many flags that allow for simple testing of features, the NATS server
products provide a flexible configuration format that combines the best of traditional formats and
newer styles such as JSON and YAML."
products provide a flexible configuration format that combines the best of traditional formats and
newer styles such as JSON and YAML."
"NATS is designed to move messages through the server quickly. As a result, NATS depends on the applications to consider and respond to changing message rates. The server will do a bit of impedance matching, but if a client is too slow the server will eventually cut them off by closing the connection. These cut off connections are called slow consumers."
- What is the difference between Request() and Publish()?
- 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.
- Can multiple subscribers receive a Request?
- NATS is a publish and subscribe system that also has distributed queueing functionality on a per subscriber basis.
- Monitoring?
- Prometheus NATS Exporter Use Prometheus to configure metrics and Grafana to create a visual display.
- Size Limitations?
- 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.
- https://github.com/nats-io/nats.py/issues/46
max_payload
defaults to 1MB, but it can be configured in the server:- https://github.com/nats-io/nats.go/issues/63
- KM Comment: As of 2020-07-25, this issue is still "Open"
- "The server enforces, but will send the error in an async fashion. The client should register this from the info and enforce it at the client API level."
- https://stackoverflow.com/questions/55368487/send-a-message-larger-than-1mb-using-nats-streaming
- "Messaging systems are not supposed to be used for file transfer. Use a distributed storage service to hold files and pass file ID in the message."
- "You can change the message size for nats while configuring the server."
$ nats-server --config /path/to/nats.config
# Override message size limit (bytes): max_payload: 100000000
https://groups.google.com/forum/#!topic/natsio/Uwly62MRCzg
- "suggest...using NATS to pass around file "pointers", e.g. an S3 bucket URL, and transferring the actual files out-of-band. NATS is better suited to smaller messages, so I would advise against sending large BLOBs through it since you'd potentially be sequencing lots of 1MB messages (the default max payload size) and reassembling them."
- KM Comment: Read this post - there is a very good discussion in several other responses that elaborate on why pushing large files through NATS is a bad idea.
- Does NATS offer any guarantee of message ordering?
- 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.
Github Resources
Docker Resources
Articles
- 2020
- ...
- 2018
- https://simplydistributed.wordpress.com/2018/03/30/kafka-nats-random-notes/
- "Kafka clients use a poll-based technique in order to extract messages as
opposed to NATS where the server itself routes messages to clients
(maintains an
interest-graph
internally)" - "NATS can act pretty sensitive in the sense that it has the ability to cut off consumers who are not keeping pace with the rate of production as well as clients who don’t respond to heartbeat requests."
- "NATS doesn’t seem to have a notion of partitioning/sharding messages like Kafka does"
- https://medium.com/@philipfeng/modern-open-source-messaging-apache-kafka-rabbitmq-nats-pulsar-and-nsq-ca3bf7422db5
- "NATS was originally built with Ruby and achieved a respectable 150k messages per second. The team rewrote it in Go, and now you can do an absurd 8–11 million messages per second."
- "Fire and forget, no persistence: NATS doesn’t do persistent messaging; if you’re offline, you don’t get the message."
- "NATS is not HTTP, it’s its own very simple text-based protocol, RPC-like. So it does not add any header to the message envelope."
- "NATS doesn’t have replication, sharding or total ordering"
- "With NATS, queues are effectively sharded by node. If a node dies, its messages are lost."
- "To fully guarantee that a message won’t be lost, it looks like you need to declare the queue as durable + to mark your message as persistent + use publisher confirms. And this costs several hundreds of milliseconds of latency."
- "NATS is useful when raw performance is a priority."
- vs. Kafka:
- "The broker barely knows anything about the consumer. All that’s really stored is an “offset” value that specifies where in the log the consumer left off."
- "Topics are arranged in partitions (for parallelism), and partitions are replicated across nodes (for high availability)."
- "Kafka is more matured compared to Nats and performs very well with huge data streams."
- "The only queue or pub/sub system that is relatively safe from partition errors is Kafka"
- "Kafka is just a really solid piece of engineering when you need 5–50 servers. With that many servers, you can handle millions of messages per second"
- "Kafka is binary over TCP"
- "Consumer cannot acknowledge message from a different thread"
- "No multitenancy"
- "Management in a cloud environment is difficult."
- https://www.quora.com/Is-NATS-IO-a-real-alternative-to-Kafka-Who-used-it-in-a-production
- 2017
- https://storageos.com/nats-good-gotchas-awesome-features
- "Over the last two years, I have used NATS extensively in many projects"
- "Lack of proper authentication. The current authentication method in NATS is not intended for end-users, and there is no way to dynamically add/remove users to NATS server."
- [KM TODO: Follow-up and see if this is still true]
- "If you want a battle tested messaging system between your cluster nodes, I would definitely recommend NATS, which despite being in the community for a long time has done a great job of avoiding feature creep and bloat."
- 2016
No comments:
Post a Comment