NATS는 고성능, 경량, 클라우드 네이티브 메시징 시스템이다. "단순함, 성능, 보안"을 설계 철학으로 하며, 단일 바이너리로 메시지 브로커, 스트리밍(JetStream), KV 스토어, 객체 스토어를 제공한다.
핵심 패턴
Pub/Sub: 발행-구독 (fire-and-forget)
Publisher → [subject] → Subscriber(들)
Request/Reply: 동기 요청-응답
Requester → [subject] → Responder → Reply
Queue Group: 부하 분산
Publisher → [subject] → [Queue Group] → 하나의 Worker
JetStream: 영속 메시징 (Kafka 유사)
Producer → Stream → Consumer (ack 필요)
Go 클라이언트
go
package main
import (
"fmt"
"time"
"github.com/nats-io/nats.go"
)
func main() {
nc, _ := nats.Connect(nats.DefaultURL)
defer nc.Drain()
// Pub/Sub
nc.Subscribe("orders.new", func(m *nats.Msg) {
fmt.Printf("Received: %s
", string(m.Data))
})
nc.Publish("orders.new", []byte(`{"id":1001}`))
// Request/Reply
nc.Subscribe("calc.add", func(m *nats.Msg) {
m.Respond([]byte("42"))
})
reply, _ := nc.Request("calc.add", []byte(`{"a":20,"b":22}`), time.Second)
fmt.Println(string(reply.Data))
// Queue Group (부하 분산)
for i := 0; i < 3; i++ {
nc.QueueSubscribe("tasks", "workers", func(m *nats.Msg) {
fmt.Printf("Worker got: %s
", m.Data)
})
}
// JetStream
js, _ := nc.JetStream()
js.AddStream(&nats.StreamConfig{
Name: "ORDERS",
Subjects: []string{"orders.*"},
})
js.Publish("orders.created", []byte(`{"id":1002}`))
sub, _ := js.Subscribe("orders.*", func(m *nats.Msg) {
m.Ack()
}, nats.Durable("order-processor"))
defer sub.Unsubscribe()
}
NATS vs 경쟁 제품 비교
| 항목 | NATS | Kafka | RabbitMQ |
|---|
| 지연시간 | < 1ms | 수 ms | 수 ms |
| 처리량 | 수천만/초 | 수백만/초 | 수만/초 |
| 운영 복잡도 | 낮음 | 높음 (ZooKeeper) | 중간 |
| 영속성 | JetStream | 기본 | 선택 |
| 프로토콜 | NATS/WebSocket | TCP | AMQP |
| 멀티테넌시 | Account 기반 | 제한적 | vHost |
관련 문서