0

[Open Source] #65 - Novu: Hạ tầng thông báo hợp nhất triệu người dùng với NestJS, Redis và kiến trúc Workflow Engine

Việc quản lý thông báo (Email, SMS, Push, In-app) cho một hệ thống quy mô lớn là một "cơn ác mộng" về tích hợp. Bạn phải đối mặt với việc duy trì hàng chục SDK của các nhà cung cấp khác nhau, xử lý logic gửi tin (Retry, Delay, Digest), và quản lý tùy chọn (Preferences) của từng người dùng. Novu xuất hiện như một giải pháp "Notification Infrastructure as Code", giúp bạn tập trung vào logic sản phẩm thay vì sa lầy vào hạ tầng gửi tin.

Dưới góc độ kỹ thuật, Novu là một Case Study điển hình về việc xây dựng hệ thống Event-driven quy mô lớn bằng TypeScriptNestJS, áp dụng những chuẩn mực cao nhất của kiến trúc Microservices.

Github: https://github.com/novuhq/novu


🛠️ 1. Nền tảng công nghệ: Monorepo và Edge-ready Stack

Novu tận dụng sức mạnh của hệ sinh thái TypeScript để tạo ra một hạ tầng đồng nhất từ Backend đến SDK:

  • Lõi thực thi (NestJS): Tận dụng tính Modular của NestJS để chia nhỏ các service (API, Worker, Webhook, WebSocket). Điều này cho phép Novu scale riêng lẻ các thành phần tiêu tốn nhiều tài nguyên như Worker xử lý hàng đợi.
  • Hệ thống hàng đợi (BullMQ & Redis): Trái tim của khả năng chịu tải. Novu sử dụng BullMQ để quản lý hàng triệu Job thông báo mỗi ngày, đảm bảo tính bất đồng bộ, khả năng Retry khi nhà cung cấp lỗi và cơ chế Rate Limiting.
  • Dữ liệu đa tầng:
    • MongoDB: Lưu trữ Metadata, Templates và trạng thái Subscriber.
    • Redis: Quản lý hàng đợi và Cache tốc độ cao.
    • ClickHouse: Xử lý dữ liệu phân tích (Analytics) và Logs ở quy mô Big Data.
  • Quản lý mã nguồn: Sử dụng Nx Monorepo giúp quản lý hàng chục package (SDK, Providers, Dashboard) một cách khoa học và tối ưu build time.

🏗️ 2. Trụ cột kiến trúc: Provider Agnostic và Workflow Driven

Kiến trúc của Novu giải quyết bài toán "Vendor Lock-in" (bị phụ thuộc vào một nhà cung cấp) bằng các lớp trừu tượng:

  • Abstraction Layer (Lớp trừu tượng): Novu tạo ra một giao diện chung cho tất cả các kênh thông báo. Bạn chỉ cần code một lần, việc chuyển đổi từ SendGrid sang Mailgun hoặc Twilio sang Vonage chỉ là thao tác bật/tắt trong Dashboard mà không cần sửa một dòng code nào.
  • Workflow Engine: Cho phép lập trình các luồng thông báo phức tạp dưới dạng đồ thị (DAG). Ví dụ: Gửi In-app ngay -> Chờ 1 giờ -> Nếu người dùng chưa đọc -> Gửi tiếp Email.
  • Digest Engine: Kỹ thuật thông minh giúp giảm nhiễu cho người dùng bằng cách gom nhiều thông báo lẻ thành một thông báo tổng hợp (ví dụ: "Bạn có 10 thông báo mới" thay vì gửi 10 email liên tục).

🔄 3. Workflow: Luồng đi của một thông báo (Sequence Diagram)

Sơ đồ dưới đây mô tả hành trình từ lúc hệ thống của bạn kích hoạt một sự kiện đến khi thông báo tới tay người dùng:

image.png


⚡ 4. Các kỹ thuật "Pro-level" trong mã nguồn

  1. Usecase-Driven Architecture: Novu tách biệt logic nghiệp vụ vào các lớp usecases. Mỗi hành động (như SendNotification hay CreateSubscriber) là một đơn vị logic độc lập, giúp code cực kỳ dễ Unit Test và duy trì tính nhất quán.
  2. Stateless Provider Management: Lớp xử lý nhà cung cấp được thiết kế dưới dạng stateless. Hệ thống có thể nạp động các cấu hình provider từ database mà không cần khởi động lại server, cho phép người dùng thay đổi cấu hình hạ tầng ngay trong thời gian thực.
  3. Idempotency (Tính ổn định): Sử dụng idempotency-key trong các yêu cầu API để đảm bảo rằng nếu hệ thống của bạn gọi lại một yêu cầu do lỗi mạng, Novu sẽ không gửi thông báo đó lần thứ hai, tránh gây phiền hà cho người dùng cuối.
  4. In-app Realtime với Socket.io: Tích hợp bộ quản lý kết nối WebSocket ngay trong lõi, cho phép đẩy các "Notification Center" vào ứng dụng Web/Mobile một cách mượt mà với trạng thái đọc/chưa đọc đồng bộ ngay lập tức.

⚖️ 5. So sánh chiến lược

Tiêu chí Novu Infrastructure Tích hợp trực tiếp SDK (SendGrid/Twilio) Courier / SES (SaaS)
Quyền kiểm soát Toàn quyền (Self-hosted/Cloud) Tuyệt đối Bị giới hạn (Blackbox)
Độ phức tạp code Thấp (1 API duy nhất) Rất cao (Nhiều SDK) Thấp
Khả năng mở rộng Rất cao (Distributed workers) Tự build hạ tầng Tự động
Tính năng Digest Sẵn có Phải tự code logic phức tạp Sẵn có (nhưng đắt)

✅ Kết luận: Tại sao Novu là chuẩn mực mới?

Novu không chỉ là một công cụ gửi email hay SMS; nó là một bài học về Trừu tượng hóa hệ thống (System Abstraction). Dự án chứng minh rằng những tác vụ lặp đi lặp lại và phức tạp như thông báo hoàn toàn có thể được đóng gói thành một hạ tầng mạnh mẽ, ổn định và linh hoạt.

Đối với các kỹ sư backend, nghiên cứu Novu sẽ giúp bạn hiểu sâu về:

  • Cách vận hành Distributed Job Queue với BullMQ và Redis.
  • Tư duy thiết kế Modular Monolith trong NestJS.
  • Cách xây dựng lớp Provider Integration để hỗ trợ hàng trăm bên thứ ba một cách sạch sẽ.

Hy vọng bản phân tích này mang lại cho bạn những góc nhìn giá trị về kiến trúc hạ tầng hiện đại. Đừng quên Upvote và Follow để theo dõi những bài phân tích "khủng" tiếp theo nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí