NATS
NATS — простой быстрый брокер сообщений (Derek Collison, 2010, изначально для Cloud Foundry). CNCF-проект. Написан на Go. Публикация в subject, subscribe pattern. Минималистичный, embed-friendly.
Модель subject-based
# pub/sub через subjects
sub "orders.*" → получит orders.created, orders.paid
sub "orders.>" → получит orders.created.eu, orders.paid.us
pub "orders.created" body
# queue group — одно сообщение одному подписчику из группы
sub "orders.*" queue="workers"
Протокол — plain text
CONNECT {"verbose":false}\r\n
SUB orders.* 1\r\n
PUB orders.created 5\r\n
hello\r\n
MSG orders.created 1 5\r\n
hello\r\n
PING\r\n
PONG\r\n
Можно debug через telnet.
Core NATS vs JetStream
| Core NATS | JetStream | |
|---|---|---|
| Persistence | fire-and-forget | на диск |
| Replay | нет | по offset/time |
| At-least-once | нет | да |
| Latency | микросекунды | миллисекунды |
JetStream
Persistent слой поверх NATS (с 2020). Streams (топики), consumers, replay, KV store, Object store. Аналог Kafka+Redis в одном.
Request-Reply
# RPC поверх pub/sub
Клиент: sub "_INBOX.abc123"
Клиент: pub "user.get" reply="_INBOX.abc123" body="id=42"
Сервер: sub "user.get"
Сервер: получает msg, отвечает pub "_INBOX.abc123" body='{"name":"Vasya"}'
Клиент: получает ответ
Cluster / Leaf / Super-cluster
- Cluster — узлы в одном DC (mesh, всё-со-всем)
- Super-cluster — gateway'и между кластерами (multi-region)
- Leaf nodes — маленькие узлы на edge (IoT), проксируют к центральному кластеру
Что решает лучше других
- Микросервисы с request-reply
- IoT, edge (leaf nodes)
- Sidecar/embed (nats-server 15МБ бинарь)
- Multi-tenancy (accounts, isolation)
- Cloud-native config: без ZK, без внешних БД
Клиенты
Go, Node, Python, Java, .NET, Rust, C, WebSocket (nats.ws). Простое TCP+text = кто угодно.