Amazon SQS (Simple Queue Service)
Amazon SQS (Simple Queue Service) là dịch vụ message queuing hoàn toàn quản lý (fully managed) của AWS. Nó cho phép bạn truyền tải dữ liệu giữa các thành phần trong ứng dụng một cách bất đồng bộ (asynchronous) và tách biệt (decoupled).
Thay vì các service giao tiếp trực tiếp, chúng có thể trao đổi thông qua một hàng đợi (queue), giúp ứng dụng dễ mở rộng và chịu lỗi hơn.
Tại sao cần SQS?
Trong ứng dụng truyền thống:
- Một service phải đợi service khác xử lý xong mới tiếp tục được → dễ gây tắc nghẽn.
- Nếu một service gặp sự cố, toàn bộ hệ thống có thể bị ảnh hưởng.
Với Amazon SQS:
- Producer (người gửi) chỉ cần gửi message vào queue.
- Consumer (người nhận) xử lý message khi sẵn sàng.
- Message được lưu trữ an toàn cho đến khi xử lý xong hoặc hết thời gian TTL (Time-to-Live).
Điều này đảm bảo decoupling và reliability cho ứng dụng.
Các loại Queue trong SQS
Amazon SQS cung cấp 2 loại queue chính:
1. Standard Queue
- Throughput hầu như không giới hạn.
- At-least-once delivery: Một message có thể được gửi nhiều lần.
- Best-effort ordering: Không đảm bảo thứ tự tuyệt đối, nhưng thường theo thứ tự gần đúng.
- Giới hạn 256KB/Message
- Mặc định thời gian lưu trữ Message trong Queue là 4 ngày. Có thể up to 14 ngày
- Phù hợp cho:
- Hệ thống xử lý high throughput, như log processing, background tasks.
- Hệ thống không quá nhạy cảm về thứ tự hoặc trùng lặp.
2. FIFO Queue (First-In-First-Out)
- Đảm bảo exactly-once processing: mỗi message chỉ xử lý đúng một lần.
- Thứ tự nghiêm ngặt (First-In-First-Out).
- Hạn chế hơn về throughput (chỉ vài nghìn TPS).
- Phù hợp cho: hệ thống yêu cầu thứ tự chính xác, như xử lý tài chính, giao dịch, đơn hàng.
Producing/Consuming messages
-
Producing messages:
- Gửi message vào Queue
- Message tồn tại trong SQS cho tới khi Consumer xoá nó
- Message được lưu trong Queue: 4 ngày (mặc đinh) và upto 14 ngày
-
Consuming messages:
- Consumers có thể chạy trên EC2, Lambda…
- Poll từ SQS để lấy về các Messages
- Xử lý các Message
- Xoá message ra khỏi Queue khi xử lý xong
Các tính năng quan trọng
Message Retention là gì
- Message có thể setting để giữ lại trong queue từ 1 phút đến 14 ngày.
- Sau khi hết thời gian này, message sẽ bị xóa tự động, cho dù chưa được xử lý.
Với job quan trọng (ví dụ giao dịch tài chính), cần retention dài để đảm bảo có thời gian khôi phục hệ thống.
Visibility Timeout là gì
Ý nghĩa: khi consumer lấy 1 message ra, SQS ẩn message đó trong một khoảng thời gian (Visibility Timeout) để tránh bị xử lý trùng lặp.
- Mặc định là 30 giây (có thể config từ 0 giây → 12 giờ).
- Nếu Consumer chưa kịp xoá trong thời gian timeout → message xuất hiện lại, và consumer khác có thể đọc và xử lý → có thể bị xử lý trùng.
- Ví dụ:
- Consumer lấy message “OrderID: 1234”, mất 40 giây để xử lý.
- Visibility Timeout = 30 giây → sau 30 giây, message lại hiện ra → 1 consumer khác cũng xử lý → double processing.
Dead-Letter Queue (DLQ) là gì
- DLQ là queue đặc biệt để chứa các message lỗi, những message này không được xử lý sau nhiều lần Retry.
- Ví dụ:
- Setting Maximum Receives là 3
- Nếu 1 message bị lấy ra quá 3 lần mà chưa xoá thành công → message sẽ tự động bị chuyển sang DLQ.
CHÚ Ý:
- Message sau khi được xử lý sẽ không được xoá đi theo mặc định
- Trong hệ thống cần call đến
DeleteMessagenếu message được xử lý thành công - Nếu không nó sẽ bị rơi vào DLQ
Long Polling là gì
-
Bình thường (Short Polling): Consumer gọi
ReceiveMessage→ nếu không có message → trả về rỗng ngay. -
💡 Long Polling cho phép giữ kết nối tối đa 20 giây để chờ message xuất hiện.
- Nếu trong thời gian đó có message → trả về ngay. Nếu không có → mới trả về rỗng.
-
Ví dụ:
- Không có “Long Polling” → Consumer gọi 1.000 lần/giây để check queue.
- Có long polling (20 giây) → chỉ gọi khi thực sự có message → tiết kiệm hàng trăm nghìn request.
Use Cases phổ biến
- Decoupling microservices.
- Xử lý background jobs (ví dụ: resize ảnh, gửi email).
- Buffer cho workload có traffic đột biến.
- Batch processing (gom nhiều message xử lý cùng lúc).
Pricing (tổng quan)
- Tính phí theo số lượng request (gửi, nhận, xoá message).
- Dữ liệu truyền từ SQS đi ra: $0.12 /GB
- Free Tier: 1 triệu request/tháng miễn phí.
- Hỗ trợ chi phí thấp cho long polling (so với short polling).