NATS & Kafka: random notes

Abhishek Gupta
2 min readMar 30, 2018

This is not NATS vs Kafka by any means — just jotting down some info. NATS recently joined CNCF (which host projects like Kubernetes, Prometheus etc. — look at the Golang dominance here!) and that’s when it caught my attention

Here are a few things which came to mind….

Might add more later

Where — Kafka runs on JVM (Scala to be specific), NATS is written in Go

Protocol — Kafka is binary over TCP as opposed to NATS being simple text (also over TCP)

Messaging patterns — Both support pub-sub and queues, but NATS supports request-reply as well (sync and async)

Scalable processing

  • NATS has a concept of queue (with a unique name of course) and all the subscribers hooked on same queue end up being a part of the same queue group. Only one of the (potentially multiple) subscribers gets the message. Multiple such queue groups would also receive the same set of messages. This makes it a hybrid pub-sub (one-to-many) and queue (point-to-point)
  • Same thing is supported in Kafka via consumer groups​ which can pull data from one or more topics

Stream processing — NATS does not support stream processing as a first class feature like Kafka does with Kafka Streams

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)

Consumer check

  • 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.
  • The consumer liveness check is executed by Kafka as well. From what I recall, this is done/initiated from the client itself & there are complex situations that can arise due to this (e.g. when you’re in a message processing loop and don’t poll ). There are a bunch of configuration parameter/knobs to tune this behavior (on client side)

Delivery semantics — NATS supports at-most once (and at-least-once with NATS streaming) as opposed to Kafka which also supports exactly-once (tough!)

Sharding/Partitioning — NATS doesn’t seem to have a notion of partitioning/sharding messages like Kafka does

External dependency — None in case of NATS. Kafka requires Zookeeper


Originally published at on March 30, 2018.



Abhishek Gupta

Principal Developer Advocate at AWS | I ❤️ Databases, Go, Kubernetes