Back to Explore
Tại sao AWS SNS âm thầm làm mất tin nhắn của bạn và cách ngăn chặn trước khi Deploy

Tại sao AWS SNS âm thầm làm mất tin nhắn của bạn và cách ngăn chặn trước khi Deploy

Khám phá nguyên nhân khiến AWS SNS silently drop tin nhắn và các chiến lược kỹ thuật để đảm bảo tính toàn vẹn của hệ thống phân tán trước khi đưa vào môi trường Production.

Website
Upvote this postSign in to upvote this article.

Bài viết được dịch và tổng hợp từ tin tức gốc. Bạn có thể đọc bài viết gốc bằng tiếng Anh tại đây.

Điểm tin nhanh:

  • AWS SNS có thể âm thầm loại bỏ tin nhắn nếu cấu hình không khớp hoặc vượt quá giới hạn tài nguyên.
  • Việc giám sát chặt chẽ các chỉ số CloudWatch là chìa khóa để phát hiện lỗi trước khi hệ thống gặp sự cố.
  • Cần thiết lập cơ chế Dead Letter Queues (DLQ) để lưu trữ và xử lý các tin nhắn thất bại.

Trong thế giới của các hệ thống phân tán, AWS SNS (Simple Notification Service) thường được coi là một dịch vụ pub/sub đáng tin cậy. Tuy nhiên, nhiều kỹ sư đã phải trả giá đắt khi phát hiện ra rằng hệ thống của họ âm thầm làm mất tin nhắn mà không hề có cảnh báo lỗi rõ ràng. Đây không chỉ là một lỗi cấu hình đơn thuần, mà là một lỗ hổng trong tư duy thiết kế hệ thống khi chúng ta quá tin tưởng vào sự "tự động" của các dịch vụ đám mây.

Tại sao SNS lại âm thầm loại bỏ tin nhắn?

Việc SNS drop tin nhắn thường không xuất phát từ lỗi của chính AWS, mà nằm ở sự thiếu đồng bộ giữa cấu hình của nhà xuất bản (publisher) và người đăng ký (subscriber). Khi bạn xây dựng các hệ thống yêu cầu độ tin cậy cao, việc hiểu rõ cơ chế này là cực kỳ quan trọng, tương tự như cách bạn tối ưu hóa kiến trúc Hexagonal trong Go để đảm bảo tính bền vững.

Ảnh bìa bài viết

Các nguyên nhân phổ biến

  1. Policy không khớp: Nếu chính sách truy cập (Access Policy) của SNS Topic không cho phép SQS Queue hoặc Lambda nhận tin nhắn, SNS sẽ âm thầm từ chối chuyển tiếp.
  2. Vượt quá giới hạn kích thước: Tin nhắn vượt quá 256KB sẽ bị từ chối nếu không được cấu hình đúng cách.
  3. Cấu hình Retry không đủ: Khi subscriber không phản hồi, SNS sẽ thực hiện retry theo chính sách đã định. Nếu hết số lần thử, tin nhắn sẽ bị loại bỏ nếu không có DLQ.

Bảng so sánh các chỉ số giám sát quan trọng

Để phát hiện sớm các vấn đề này, bạn cần theo dõi các chỉ số sau trên CloudWatch:

Chỉ số (Metric) Ý nghĩa Hành động cần thực hiện
NumberOfMessagesPublished Tổng số tin nhắn gửi vào SNS Đối soát với số lượng nhận được
NumberOfNotificationsFailed Số tin nhắn không thể gửi tới subscriber Kiểm tra logs và cấu hình endpoint
NumberOfNotificationsFilteredOut Tin nhắn bị lọc bởi Subscription Filter Policy Kiểm tra lại logic filter

Cách ngăn chặn trước khi Deploy

Để tránh tình trạng này, bạn cần áp dụng các chiến lược kiểm thử nghiêm ngặt. Đừng để hệ thống của bạn rơi vào tình trạng "im lặng" như khi sản phẩm ra mắt trong im lặng. Hãy tích hợp các công cụ quan sát như SigNoz để theo dõi luồng tin nhắn, tương tự như cách bạn trải nghiệm thực tế với SigNoz.

Cover image for Why SNS Silently Drops Your Messages and How to Catch It Before You Ship

Mẹo hay: Luôn luôn cấu hình Dead Letter Queue (DLQ) cho mọi Subscription của bạn. Đây là "hộp đen" giúp bạn truy vết lại những tin nhắn đã thất bại.

Sơ đồ luồng xử lý tin nhắn an toàn

[Publisher] ---> [SNS Topic] ---> [Subscription Filter] ---> [Target (SQS/Lambda)]
|
v
[Dead Letter Queue]

Nếu bạn đang xây dựng các hệ thống phức tạp, hãy cân nhắc việc tối ưu hóa hiệu suất Email Agent hoặc các dịch vụ tương tự để đảm bảo mọi sự kiện đều được ghi lại.

Đánh giá & Lời khuyên Thực tiễn

Từ góc độ của một Senior Tech Lead, SNS là một dịch vụ mạnh mẽ nhưng đòi hỏi sự cẩn trọng. Ưu điểm lớn nhất là khả năng mở rộng (scalability) cực cao, nhưng nhược điểm là cơ chế báo lỗi không trực quan đối với người mới.

Lời khuyên:

  • Luôn sử dụng Infrastructure as Code (Terraform/CDK) để quản lý cấu hình SNS, tránh cấu hình thủ công trên giao diện console.
  • Thiết lập cảnh báo (Alarm) trên CloudWatch cho chỉ số NumberOfNotificationsFailed.
  • Kiểm tra kỹ các Filter Policy, vì đây là nơi dễ xảy ra lỗi logic khiến tin nhắn bị loại bỏ mà không có lỗi hệ thống.

Câu hỏi thường gặp (FAQ)

Tại sao tin nhắn của tôi không vào DLQ dù đã thất bại?

Có thể do bạn chưa cấu hình DLQ cho Subscription đó. DLQ phải được gắn trực tiếp vào từng Subscription, không phải vào Topic.

Làm sao để biết tin nhắn bị loại bỏ do Filter Policy?

Bạn có thể kiểm tra chỉ số NumberOfNotificationsFilteredOut trên CloudWatch để xác định xem tin nhắn có bị chặn bởi logic lọc hay không.

Có cách nào để debug SNS local không?

Bạn có thể sử dụng LocalStack để giả lập môi trường AWS SNS trên máy cục bộ, giúp kiểm thử các kịch bản lỗi trước khi deploy lên môi trường thật.

Kết luận

Việc SNS âm thầm làm mất tin nhắn là một bài học đắt giá về sự cần thiết của việc giám sát chủ động. Bằng cách hiểu rõ cơ chế vận hành và thiết lập các hàng rào bảo vệ như DLQ và CloudWatch Alarms, bạn có thể đảm bảo hệ thống của mình luôn vận hành ổn định. Hãy bắt đầu rà soát lại cấu hình SNS của bạn ngay hôm nay và đừng quên theo dõi hi_dev để cập nhật thêm những kiến thức chuyên sâu về kỹ thuật hệ thống.

Discussion (0)

You need to log in to post comments. Log In

No comments yet. Start the discussion!