Giới thiệu về Microservices và RabbitMQ trong NestJS
Microservices (dịch vụ vi mô) là một mô hình kiến trúc phần mềm, trong đó các ứng dụng lớn được chia thành những dịch vụ nhỏ, độc lập và có thể triển khai cũng như mở rộng một cách riêng biệt. NestJS, một framework cho Node.js, cung cấp hỗ trợ mạnh mẽ cho kiến trúc Microservices thông qua việc tích hợp các message broker như RabbitMQ.
RabbitMQ là một message broker cho phép giao tiếp không đồng bộ giữa các dịch vụ thông qua việc gửi và nhận message qua các queues và exchanges. NestJS đã tích hợp sẵn RabbitMQ để giúp các nhà phát triển dễ dàng thiết lập và quản lý quá trình giao tiếp giữa các microservices.
Lý do nên sử dụng RabbitMQ trong Microservices
Lợi ích:
- Giao tiếp không đồng bộ:
- Cho phép dịch vụ hoạt động mà không bị phụ thuộc vào phản hồi ngay lập tức từ các dịch vụ khác, từ đó nâng cao hiệu suất tổng thể.
- Tính tách biệt:
- Các microservices có thể hoạt động độc lập, giao tiếp qua RabbitMQ mà không phụ thuộc lẫn nhau, điều này làm giảm độ phức tạp.
- Khả năng mở rộng:
- Việc mở rộng từng microservice trở nên dễ dàng mà không ảnh hưởng đến toàn bộ hệ thống.
- Quản lý lỗi hiệu quả:
- RabbitMQ cung cấp các cơ chế quản lý message như xác nhận và dead-letter queue, cho phép tái gửi message khi có lỗi xảy ra.
- Khả năng tương tác phân tán:
- RabbitMQ hỗ trợ giao tiếp qua mạng trong các kiến trúc phân tán, giúp cho các hệ thống có thể giao tiếp linh hoạt hơn.
Hạn chế:
- Tính phức tạp gia tăng:
- Việc quản lý RabbitMQ, cấu hình message queues và môi trường có thể phức tạp hơn so với giao tiếp trực tiếp.
- Độ trễ trong giao tiếp:
- Giao tiếp thông qua RabbitMQ có thể bị trễ hơn do việc trung gian qua broker, không nhanh như giao tiếp trực tiếp.
- Khó khăn khi debug:
- Khi có lỗi trong quá trình xử lý message, việc tìm ra nguyên nhân có thể gặp khó khăn nếu không có hệ thống log và giám sát tốt.
Quy trình hoạt động thực tế
-
Producer gửi message:
- Người dùng gửi yêu cầu tạo đơn hàng qua REST API (
POST /orders
). - Message chứa thông tin đơn hàng sẽ được gửi đến RabbitMQ.
- Người dùng gửi yêu cầu tạo đơn hàng qua REST API (
-
Consumer xử lý message:
- Consumer sẽ nhận message từ queue
orders_queue
. - Thực hiện các logic xử lý đơn hàng như lưu vào database hoặc gọi API khác.
- Consumer sẽ nhận message từ queue
Các Use Case Thực Tế
-
Hệ thống đặt hàng trực tuyến:
- Producer (API Gateway): Gửi thông tin đơn hàng.
- Consumer (Order Service): Xử lý đơn hàng.
- Consumer (Notification Service): Gửi thông báo cho khách hàng.
-
Hệ thống phân tích log:
- Producer (App Services): Gửi log đến RabbitMQ.
- Consumer (Log Analyzer): Xử lý và lưu trữ log.
-
Hệ thống thanh toán:
- Producer (Payment Gateway): Gửi trạng thái thanh toán.
- Consumer (Order Service): Cập nhật trạng thái đơn hàng.
Triển khai Microservices với RabbitMQ sử dụng NestJS và Docker
Bước 1: Chuẩn bị môi trường
1. Khởi tạo dự án NestJS
Tạo hai dự án NestJS:
api-gateway
(Producer)order-service
(Consumer)
# Tạo API Gateway (Producer)
nest new api-gateway
cd api-gateway
yarn add @nestjs/microservices amqplib
# Tạo Order Service (Consumer)
cd ..
nest new order-service
cd order-service
yarn add @nestjs/microservices amqplib
2. Docker Compose cho RabbitMQ
Tạo file docker-compose.yml
:
version: '3.8'
services:
rabbitmq:
image: rabbitmq:3-management
container_name: rabbitmq
ports:
- "5672:5672" # RabbitMQ protocol port
- "15672:15672" # RabbitMQ management UI
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
Khởi chạy RabbitMQ bằng lệnh:
docker-compose up -d
Truy cập vào UI quản lý tại: http://localhost:15672 (user: guest
, pass: guest
).
Bước 2: Triển khai API Gateway (Producer)
1. Cấu hình Producer
Tạo OrderService
trong api-gateway
để gửi thông tin đơn hàng. Cấu hình của tệp sẽ bao gồm việc gửi request tới RabbitMQ.
2. Triển khai Order Service (Consumer)
Tạo một microservice để xử lý sự kiện từ RabbitMQ và thực hiện các logic cần thiết như lưu đơn hàng vào cơ sở dữ liệu. Thực hiện mô hình điều khiển của service để xử lý message từ queue.
Bước 3: Triển khai Notification Service (Consumer phụ)
Thêm một service khác để xử lý thông báo người dùng hoặc các tác vụ phụ khác khi có đơn hàng mới.
Bước 4: Kiểm tra hoạt động
Khởi động các ứng dụng:
- Chạy API Gateway và Order Service.
Sử dụng công cụ như Postman hoặc curl để gửi yêu cầu tạo đơn hàng đến API Gateway cho đến khi xác nhận hoạt động thành công.
Lợi ích của kiến trúc Microservices
- Phân tách trách nhiệm rõ ràng:
- API Gateway chỉ có nhiệm vụ tiếp nhận và gửi yêu cầu, không cần xử lý logic.
- Khả năng mở rộng dễ dàng:
- Có thể thêm hoặc xóa các consumer mà không cần thay đổi producer.
- Độ tin cậy cao:
- RabbitMQ đảm bảo message không bị mất nếu được cấu hình hợp lý.
Câu hỏi và Thảo luận
Nguyên lý cốt lõi của kiến trúc Microservice là gì? Những khái niệm liên quan đến RabbitMQ mà bạn cần hiểu rõ là gì? Việc triển khai trong một dự án lớn có cần những điều chỉnh nào đặc biệt không?
Tài liệu tham khảo
- Hướng dẫn triển khai Microservices với RabbitMQ trong NestJS
- Documentation cho Microservices của NestJS
- Github repository cho các ví dụ microservice
Kết luận
Triển khai microservices bằng RabbitMQ trong NestJS mang lại nhiều lợi ích về sự phân tách trách nhiệm, khả năng mở rộng, và độ tin cậy cao cho các hệ thống phần mềm hiện đại.
source: viblo