Amazon Simple Notification Service (AWS SNS) – Bài 20

Với một thông điệp duy nhất, Amazon SNS (Simple Notification Service) có thể phân phối đồng thời tới nhiều kênh khác nhau như email, SMS, Lambda, SQS hay API endpoint giúp quá trình truyền tải thông báo trở nên nhanh chóng, linh hoạt và dễ mở rộng.

Xem thêm:

Amazon CloudWatch – Bài 17

Amazon CloudFront – Bài 18

Amazon SQS – Bài 19

1. Amazon SNS (Simple Notification Service) là gì?

Amazon SNS là một dịch vụ nhắn tin theo mô hình Publish-Subscribe (Pub/Sub), giúp các ứng dụng dễ dàng gửi thông báo đến nhiều hệ thống khác nhau cùng lúc mà không cần phải kết nối trực tiếp từng hệ thống.

Amazon SNS (Simple Notification Service) là gì?

Giả sử một ứng dụng xử lý đơn hàng:

  • Sau khi khách đặt hàng, hệ thống cần thông báo cho nhiều bên:
    • Dịch vụ phát hiện gian lận (fraud detection).
    • Dịch vụ vận chuyển.
    • Email khách hàng để xác nhận đơn hàng.

Trong mô hình truyền thống, ứng dụng sẽ phải gửi lần lượt thông báo tới từng hệ thống → phức tạp, khó mở rộng.

Với SNS:

  • Ứng dụng chỉ cần gửi thông báo một lần duy nhất đến SNS Topic.
  • Các hệ thống cần nhận thông báo (Subscribers) như Lambda, SQS, email, SMS, HTTP endpoint… chỉ việc đăng ký (subscribe) vào Topic.
  • Khi có thông điệp mới, SNS tự động gửi đồng thời đến tất cả subscribers.
  • Mỗi Topic có thể hỗ trợ hơn 12 triệu subscribers.
  • Một tài khoản AWS có thể tạo tối đa 100.000 Topics (và có thể tăng thêm nếu cần).

Nói cách khác: Amazon SNS giống như một loa phát thanh trung tâm. Publisher chỉ cần nói một lần vào loa (gửi vào Topic), và tất cả những ai đang lắng nghe (Subscribers) sẽ cùng lúc nhận được thông điệp.

2. Các hình thức nhận thông báo

Subscribers có thể là:

  • Email, SMS hoặc Push Notification tới thiết bị di động (thông qua Apple APNS, Google GCM, Amazon ADM…)
  • HTTP/HTTPS endpoint
  • Dịch vụ AWS như:
    • SQS: gửi thông báo vào hàng đợi
    • AWS Lambda: thực thi code phản hồi
    • Kinesis Firehose: ghi dữ liệu vào Amazon S3, Redshift, hoặc Elasticsearch

Với thiết bị di động, SNS hỗ trợ Direct Publish bằng cách tạo Platform ApplicationPlatform Endpoint. Bạn có thể gửi thông báo trực tiếp đến người dùng thông qua các nền tảng như:

  • Apple Push Notification Service (APNS)
  • Google Cloud Messaging (GCM)
  • Amazon Device Messaging (ADM)

Các hình thức nhận thông báo SNS

3. Mô hình Fan-out với Amazon SNS và SQS

Mô hình fan-out là một cách tiếp cận phổ biến trong kiến trúc hướng sự kiện (event-driven architecture). Ở mô hình này, một thông điệp chỉ cần gửi một lần đến SNS Topic, và từ đó SNS sẽ tự động phân phối bản sao đến nhiều hàng đợi SQS đã đăng ký.

Cách làm này giúp đơn giản hóa quá trình truyền tải: thay vì phải gửi riêng lẻ tới từng SQS queue (dễ gặp rủi ro nếu ứng dụng bị gián đoạn hoặc xảy ra lỗi kết nối), hệ thống chỉ cần giao tiếp với SNS một lần duy nhất.

Ví dụ, một buying service cần thông báo cho hai dịch vụ khác: fraud detectionshipping. Thay vì phải gửi 2 thông điệp đến 2 hàng đợi SQS, buying service chỉ việc gửi một thông điệp lên SNS Topic. Sau đó, cả fraud detection và shipping – vốn đã đăng ký làm subscribers – sẽ nhận được thông điệp này thông qua hàng đợi SQS tương ứng.

Mô hình Fan-out với Amazon SNS và SQS

4. SNS FIFO

FIFO = First In, First Out

  • Đây là nguyên tắc xử lý theo đúng thứ tự: thông điệp nào gửi trước thì sẽ được nhận trước.
  • Trong SNS FIFO Topic, điều này đảm bảo thứ tự thông điệp luôn được giữ nguyên từ producer (ứng dụng gửi) đến subscriber (dịch vụ nhận).

Cách hoạt động

  1. Producer gửi thông điệp đến SNS FIFO Topic.
  2. Subscribers (thường là SQS FIFO queues, Lambda hoặc dịch vụ khác) sẽ nhận lại đúng thứ tự ban đầu.
  3. Ví dụ: nếu producer gửi 1 → 2 → 3 → 4 thì subscriber cũng nhận theo thứ tự 1 → 2 → 3 → 4, không bị đảo lộn.

SNS FIFO

5. Message Filtering trong SNS

Amazon SNS hỗ trợ lọc thông điệp theo nội dung (message filtering). Điều này có nghĩa là mỗi subscription có thể gắn kèm một JSON filter policy để chỉ nhận những thông điệp thỏa mãn điều kiện đã định.

Ví dụ minh họa

Giả sử một SNS Topic nhận thông tin đặt hàng từ buying service, trong mỗi thông điệp có các trường:

  • order_number
  • product
  • quantity
  • state (có thể là Placed, Canceled, …)

Khi đó:

  • Queue A chỉ đăng ký nhận các đơn hàng có state = Placed.
  • Queue B sẽ nhận các đơn hàng có state = Canceled.
  • Ngoài ra, bạn có thể thêm email hoặc Lambda function làm subscriber với filter policy riêng, để chỉ nhận đúng loại thông điệp mình quan tâm.

Message Filtering trong SNS

6. SNS – Message Delivery Retries

8. Hand-On AWS SNS

Mục tiêu

  • Tạo một SNS Topic (chủ đề thông báo).
  • Đăng ký email để nhận thông báo từ Topic.
  • Gửi tin nhắn thử nghiệm để kiểm tra hoạt động.
  • Hiểu cách hoạt động của các giao thức SNS như Email, SQS, Lambda,…
  • Làm quen với quy trình xác nhận đăng ký (Subscription Confirmation).
  • Tìm hiểu về Filter Policy và cách quản lý Topic.

Các bước thực hành SNS

Bước 1: Tạo SNS Topic

  1. Truy cập SNS Console tại https://console.aws.amazon.com/sns.
  2. Chọn Create topic và chọn loại Standard.
  3. Nhập tên topic, ví dụ: MyFirstTopic.
  4. (Tuỳ chọn) Bật tính năng mã hoá (encryption) và cấu hình chính sách truy cập (access policy) nếu cần.
  5. Nhấn Create topic để hoàn tất.

Bước 2: Tạo Subscription (đăng ký nhận thông báo)

  1. Trong giao diện của Topic vừa tạo, chọn Create subscription.
  2. Tại mục Protocol, chọn Email.
  3. Nhập địa chỉ email muốn nhận thông báo, ví dụ: stephanetheteacher@mailinator.com.
  4. (Tuỳ chọn) Thêm Filter policy nếu muốn lọc nội dung nhận được.
  5. Nhấn Create subscription để gửi email xác nhận.

Bước 3: Xác nhận đăng ký

  1. Mở hộp thư điện tử đã đăng ký (ví dụ: Mailinator).
  2. Nhấn vào nút Confirm subscription trong email từ AWS SNS.
  3. Quay lại SNS Console và kiểm tra trạng thái của subscription là Confirmed.

Bước 4: Gửi thử một thông báo

  1. Trong giao diện Topic, nhấn Publish message.
  2. Nhập tiêu đề tại ô Subject, ví dụ: Test Message.
  3. Nhập nội dung tại ô Message body, ví dụ: Hello World.
  4. Nhấn Publish message.
  5. Kiểm tra hộp thư để xem email thông báo đã được gửi thành công.

Bước 5: Xoá tài nguyên sau khi kiểm tra

  • Tuỳ chọn: Unsubscribe (huỷ đăng ký) bằng cách chọn Subscription → Actions → Unsubscribe.
  • Truy cập lại Topic → chọn Delete.
  • Nhập cụm từ delete me để xác nhận xoá.

Bài viết cùng chủ đề:

Amazon Kinesis Data Streams- Bài 21

Amazon ECS – Bài 22

Amazon EKS (Elastic Kubernetes Service) – Bài 23

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em