🧩 Giới thiệu
DynamoDB là một dịch vụ NoSQL cực kỳ mạnh mẽ của AWS với hiệu suất cao, độ trễ thấp và khả năng mở rộng gần như vô hạn. Tuy nhiên, cũng giống như các hệ thống phân tán khác, các lỗi tạm thời (transient errors) có thể xảy ra trong quá trình đọc/ghi dữ liệu.
Khi gặp lỗi như ProvisionedThroughputExceededException hay InternalServerError, thay vì retry ngay lập tức, AWS khuyến cáo sử dụng Exponential Backoff kết hợp với Jitter để tránh throttle hệ thống và đảm bảo hiệu suất tổng thể.
❓ Exponential Backoff là gì?
Exponential Backoff là chiến lược retry trong đó thời gian chờ giữa các lần retry tăng dần theo cấp số nhân sau mỗi lần thất bại.
🔁 Công thức đơn giản:
delay = base * (2 ^ attemptNumber)
Ví dụ với base = 100ms
:
- Retry lần 1: chờ 100ms
- Retry lần 2: chờ 200ms
- Retry lần 3: chờ 400ms
- Retry lần 4: chờ 800ms …
Kết hợp với Jitter (ngẫu nhiên hóa delay), giúp giảm thiểu tình trạng nhiều client cùng retry cùng lúc.
💥 Vì sao cần Exponential Backoff khi dùng DynamoDB?
Các lỗi phổ biến cần retry:
Lỗi | Mô tả |
---|---|
ProvisionedThroughputExceededException | Vượt quá giới hạn đọc/ghi |
ThrottlingException | DynamoDB quá tải |
InternalServerError | Lỗi tạm thời phía server |
RequestLimitExceeded | Gửi quá nhiều yêu cầu một lúc |
Retry ngay lập tức có thể làm tình hình tệ hơn, trong khi Exponential Backoff giúp phân tán lại lưu lượng và tăng tỷ lệ thành công.
🛠 Cách triển khai Exponential Backoff khi gọi DynamoDB
1. Sử dụng SDK chính thức
Hầu hết các AWS SDK (Java, Python, Node.js, .NET, Go…) đã tích hợp sẵn Exponential Backoff với cấu hình mặc định.
Ví dụ: Python (boto3) sử dụng botocore có built-in retry logic với Exponential Backoff.
import boto3
from botocore.config import Config
config = Config(
retries = {
'max_attempts': 5,
'mode': 'standard'
}
)
dynamodb = boto3.client('dynamodb', config=config)
Bạn có thể chọn
standard
,adaptive
(có Jitter) hoặclegacy
.
2. Tự triển khai bằng tay (ví dụ: Node.js)
async function putItemWithRetry(params, maxRetries = 5, baseDelay = 100) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
await dynamodb.putItem(params).promise();
return;
} catch (error) {
if (attempt === maxRetries - 1) throw error;
const backoff = Math.pow(2, attempt) * baseDelay;
const jitter = Math.floor(Math.random() * backoff);
console.log(`Retrying after ${jitter} ms...`);
await new Promise(resolve => setTimeout(resolve, jitter));
}
}
}
🚀 Jitter giúp giảm xung đột khi nhiều client retry cùng lúc.
🔎 Adaptive Retry Mode – chế độ “tự động điều chỉnh” (Advanced)
AWS SDK v2+ hỗ trợ chế độ retry nâng cao adaptive, sử dụng tín hiệu mạng để tự điều chỉnh retry logic.
Config(
retries = {
'max_attempts': 10,
'mode': 'adaptive'
}
)
- Dựa vào lịch sử phản hồi để tối ưu thời gian chờ
- Hạn chế retry quá mức khi hệ thống đang “khó thở”
📚 Một số Best Practices
Kinh nghiệm | Giải thích |
---|---|
Luôn retry lỗi tạm thời | Đừng bỏ qua các lỗi như ThrottlingException |
Không retry lỗi logic | Ví dụ: ValidationException , ResourceNotFound |
Giới hạn số lần retry | Tránh rơi vào vòng lặp vô hạn |
Thêm Jitter | Ngẫu nhiên hóa delay để giảm tranh chấp |
Sử dụng SDK có hỗ trợ sẵn | Tránh viết lại bánh xe nếu không cần thiết |
❓Câu hỏi ôn thi DVA-C02 mẫu
Câu: Một ứng dụng sử dụng DynamoDB đang gặp lỗi ProvisionedThroughputExceededException
. Giải pháp nào giúp giảm lỗi này mà không cần tăng throughput?
A. Tăng số lượng bảng
B. Retry ngay lập tức 3 lần
C. Sử dụng Exponential Backoff khi retry
D. Thêm read replica
✅ Đáp án đúng: C
🧠 Tổng kết
Tính năng | Mục đích |
---|---|
Exponential Backoff | Giảm lỗi tạm thời khi truy cập DynamoDB |
Jitter | Giảm xung đột khi nhiều retry cùng lúc |
Adaptive Retry | Tối ưu tự động dựa trên điều kiện mạng |
SDK hỗ trợ sẵn | Không cần tự viết logic nếu không cần thiết |