0

[Open Source] #54 - listmonk: Kiến trúc Newsletter & Mailing List triệu người dùng với Go, PostgreSQL và Worker-based Engine

Việc quản lý danh sách email và gửi newsletter (Email Marketing) thường là một bài toán tốn kém nếu sử dụng các dịch vụ SaaS như Mailchimp hay SendGrid khi quy mô người dùng lên đến hàng triệu. listmonk xuất hiện như một lời giải hoàn hảo: một hệ thống tự thân (self-hosted), mã nguồn mở, cực kỳ nhẹ nhưng có khả năng xử lý hàng triệu email với tốc độ đáng kinh ngạc.

Dưới góc độ kỹ thuật, listmonk là một minh chứng cho thấy sự kết hợp giữa GolangPostgreSQL có thể tạo ra một hệ thống ổn định, hiệu năng cao và dễ triển khai đến mức nào.

Github: https://github.com/knadh/listmonk


🛠️ 1. Nền tảng công nghệ: Tối ưu cho hiệu suất và sự đơn giản

listmonk tuân thủ triết lý "Single Binary", đóng gói toàn bộ logic vào một tệp thực thi duy nhất, giúp việc vận hành (DevOps) trở nên cực kỳ tinh gọn:

  • Backend (Golang): Sử dụng Echo Framework để xây dựng RESTful API tốc độ cao. Tận dụng tối đa GoroutinesChannels để thực hiện các tác vụ gửi email song song (concurrency) mà không làm treo hệ thống.
  • Database (PostgreSQL): Đây là "xương sống" của hệ thống. listmonk tận dụng các tính năng cao cấp của Postgres như:
    • JSONB: Lưu trữ linh hoạt các thuộc tính tùy chỉnh (metadata) của người đăng ký.
    • Materialized Views: Tăng tốc độ hiển thị báo cáo thống kê (Stats) phức tạp trên Dashboard mà không cần tính toán lại từ đầu.
  • Frontend (Vue.js 3): Một giao diện Admin hiện đại, phản ứng nhanh, tích hợp sẵn các bộ soạn thảo chuyên nghiệp như TinyMCE và GrapesJS (Drag-and-drop builder).
  • Stuffbin: Kỹ thuật nhúng trực tiếp các file tĩnh (HTML/CSS/JS) và các bản cập nhật SQL (Migration) vào trong file binary của Go.

🏗️ 2. Tư duy Kiến trúc: Modular Monolith & Worker Strategy

Dù là một ứng dụng đơn khối (Monolith), listmonk được thiết kế phân rã theo các module chức năng rõ rệt để đảm bảo tính mở rộng:

  • Stateless Backend: Toàn bộ logic xử lý không lưu trạng thái trên ổ đĩa cục bộ, cho phép bạn chạy nhiều thực thể listmonk sau một Load Balancer.
  • Worker-based Manager: Hệ thống tách biệt hoàn toàn luồng xử lý Web API và luồng xử lý chiến dịch (Campaign). Một bộ Manager ngầm định kỳ quét database để tìm các chiến dịch cần gửi.
  • Plugin-friendly Messengers: Kiến trúc "Messenger" cho phép listmonk không chỉ gửi qua SMTP mà còn dễ dàng tích hợp với Amazon SES, SendGrid, hoặc thậm chí là SMS/Messenger qua HTTP Postback.

🔄 3. Workflow: Luồng xử lý một chiến dịch gửi Email (Sequence Diagram)

Sơ đồ dưới đây mô tả hành trình từ lúc Admin bấm nút "Gửi" cho đến khi nhận được báo cáo kết quả:

image.png


⚡ 4. Các kỹ thuật "Pro-level" tối ưu throughput

  1. Batching & Sliding Window: Thay vì gửi từng email một, listmonk truy vấn người dùng theo từng lô (Batch). Nó kết hợp với thuật toán Sliding Window Rate Limiting để kiểm soát tốc độ gửi, tránh việc bị các nhà cung cấp như AWS SES hay Gmail khóa tài khoản vì gửi quá nhanh (Rate limit).

  2. Tracking & Privacy: listmonk sử dụng Tracking Pixel (ảnh 1x1 trong suốt) để theo dõi lượt mở và Link Wrapping để theo dõi lượt click. Điểm đặc biệt là nó cho phép cấu hình mức độ ẩn danh để tuân thủ các luật bảo mật dữ liệu như GDPR.

  3. Bounce Handling (Xử lý email hỏng): Hệ thống tích hợp sẵn khả năng đọc hộp thư Bounce qua POP3 hoặc nhận Webhook từ các dịch vụ như SES. Khi một email bị "Bounce" (không tồn tại), listmonk tự động đưa vào danh sách đen (Blocklist) để bảo vệ uy tín của domain gửi.


⚖️ 5. So sánh chiến lược: Tại sao chọn listmonk?

Tiêu chí listmonk Mailchimp / SaaS Mailtrain (Node.js)
Chi phí Gần như miễn phí (Tự host) Rất đắt (Theo số lượng Sub) Miễn phí
Hiệu năng Cực cao (Go) Phụ thuộc nhà cung cấp Trung bình
Triển khai Single Binary (Quá dễ) Không cần (SaaS) Phức tạp (Nhiều dependency)
Cơ sở dữ liệu PostgreSQL (Tối ưu) Blackbox MySQL

✅ Kết luận: Tại sao listmonk là một hình mẫu lý tưởng?

listmonk là một bài học về Product Engineering. Nó chứng minh rằng không cần một hệ thống microservices phức tạp để xử lý dữ liệu lớn. Chỉ với một ngôn ngữ mạnh mẽ như Go, một database "vạn năng" như Postgres và tư duy đóng gói sản phẩm tốt, bạn có thể tạo ra một công cụ thay thế các dịch vụ nghìn đô.

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

  • Cách xây dựng Worker-based system trong Go.
  • Kỹ thuật tối ưu hóa truy vấn PostgreSQL với dữ liệu lớn (JSONB, Indexing, MatView).
  • Cách xử lý Tracking & Analytics trong môi trường phân tán.

Hy vọng bản phân tích này mang lại cho bạn những góc nhìn thực tế về kiến trúc hệ thống gửi tin nhắn quy mô lớn. Đừng quên Upvote và Follow mình để đón đọc những "kỳ quan" mã nguồn 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í