NATS cho Microservices – Nhẹ, nhanh, hiệu suất cao

3 min read

NATS là hệ thống messaging nhẹ, nhanh và hiệu quả, lý tưởng cho giao tiếp giữa các microservice trong kiến trúc hiện đại.

NATS là gì?

NATS (Neural Autonomic Transport System) là một hệ thống pub/sub messaging mã nguồn mở, được thiết kế để giao tiếp giữa các service với độ trễ thấp, hiệu suất cao và độ tin cậy lớn.

Những đặc điểm nổi bật của NATS:

  • Giao tiếp không đồng bộ: dựa trên mô hình publish/subscribe.
  • Hiệu năng cực cao: (hàng triệu message/giây).
  • Nhẹ: không yêu cầu cấu hình phức tạp, phù hợp với container, edge devices và cloud.
  • Hỗ trợ bảo mật: với TLS, token, JWT.
  • Hỗ trợ streaming và persistence: thông qua NATS JetStream.

NATS hoạt động như thế nào?

NATS tuân theo mô hình Pub/Sub, trong đó:

  • Các Publisher gửi message đến một subject.
  • Các Subscriber lắng nghe các subject đó để nhận message tương ứng.

Ngoài ra, NATS còn hỗ trợ:

  • Request/Reply: giúp gọi dịch vụ tương tự RPC.
  • Queue Groups: giúp load balancing giữa các subscriber.
  • JetStream: hỗ trợ lưu trữ, replay, durable subscription.

Ứng dụng của NATS trong hệ thống Microservices

Trong kiến trúc Microservices, NATS được sử dụng như một message broker giúp các service giao tiếp hiệu quả mà không phụ thuộc lẫn nhau.

Một số use case điển hình:

Tình huốngMô tả ứng dụng
Giao tiếp giữa các serviceDùng pub/sub để service A gửi message cho service B mà không cần biết địa chỉ cụ thể của B.
Logging tập trungTất cả các service publish log tới một subject, từ đó gửi về hệ thống lưu trữ tập trung.
Event sourcingMỗi sự kiện (order created, payment success…) được publish, các service liên quan sẽ react phù hợp.
Request/ReplyGửi message kèm response, ví dụ: service A cần kết quả xử lý từ service B.
Hệ thống phân tánNATS cluster có thể vertical scale, phù hợp với các môi trường cloud-native và container.

Cài đặt và sử dụng NATS cơ bản với Java

Cài đặt NATS Server (dùng Docker)

docker run -d --name nats -p 4222:4222 nats

Add dependency

<dependency>
  <groupId>io.nats</groupId>
  <artifactId>jnats</artifactId>
  <version>2.17.6</version>
</dependency>

Publisher

import io.nats.client.*;

import java.nio.charset.StandardCharsets;

public class NatsPublisher {
    public static void main(String[] args) throws Exception {
        Connection nc = Nats.connect("nats://localhost:4222");

        nc.publish("orders.created", "Order #123 created".getBytes(StandardCharsets.UTF_8));
        System.out.println("Message published!");

        nc.flush(Duration.ofSeconds(1));
        nc.close();
    }
}

Subscriber

import io.nats.client.*;

import java.nio.charset.StandardCharsets;
import java.time.Duration;

public class NatsSubscriber {
    public static void main(String[] args) throws Exception {
        Connection nc = Nats.connect("nats://localhost:4222");

        Dispatcher dispatcher = nc.createDispatcher((msg) -> {
            String received = new String(msg.getData(), StandardCharsets.UTF_8);
            System.out.println("Received message: " + received);
        });

        dispatcher.subscribe("orders.created");

        System.out.println("Listening on 'orders.created'...");
        Thread.sleep(60000);
        nc.close();
    }
}

So sánh NATS vs Kafka

Tiêu chíNATSKafka
Mô hìnhPub/Sub, Request/ReplyPub/Sub (Log-based streaming)
messageMessage nhẹ, không lưu trữ (nếu không dùng JetStream)Message được lưu trữ (log-based)
PersistenceTùy chọn: Dùng JetStream nếu cần lưu trữMặc định luôn persistent
Ordering (thứ tự message)Không đảm bảo thứ tự trừ khi dùng 1 consumerĐảm bảo thứ tự trong cùng 1 partition
Replay messageCần JetStream để replayHỗ trợ replay mặc định
Performance (tốc độ)Rất nhẹ, rất nhanh (low latency, high throughput)Cao nhưng cần tuning, overhead nhiều hơn
Phân tán & mở rộngCó cluster, nhưng không phức tạp như KafkaRất mạnh, dễ scale horizontally
Tính khả dụng caoCó HA cluster, nhưng đơn giản hơn KafkaHỗ trợ tốt với Zookeeper hoặc KRaft
Tính phức tạp khi triển khaiRất đơn giản (chạy docker)Khá phức tạp, cần setup broker, topic, zookeeper,…
Thư viện ngôn ngữ hỗ trợJava, Go, Python, JS, Rust…Java, Go, Python, JS, Rust…
SecurityTLS, Auth, Token, NKey, JWTTLS, ACL, SASL, Kerberos…
Use case phù hợpMessaging nhẹ, real-time, IoT, request/replyLogging, audit, event sourcing, big data pipelines
Message SizeTối ưu cho message nhỏ (<1MB)Tốt cho message lớn (hàng MB trở lên)

Kết luận

NATS là một giải pháp messaging cực kỳ phù hợp với các hệ thống Microservices nhờ vào tính nhẹ, nhanh và dễ triển khai. Nếu bạn đang xây dựng một hệ thống phân tán hoặc muốn tối ưu quá trình giao tiếp giữa các service, NATS có thể là sự lựa chọn cho hệ thống.

Tham khảo

https://docs.nats.io/nats-concepts/what-is-nats

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *