AWS

Ôn thi AWS DVA-C02: AWS DynamoDB Exponential Backoff

🧩 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ỗiMô tả
ProvisionedThroughputExceededExceptionVượt quá giới hạn đọc/ghi
ThrottlingExceptionDynamoDB quá tải
InternalServerErrorLỗi tạm thời phía server
RequestLimitExceededGử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ặc legacy.


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ệmGiả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 logicVí dụ: ValidationException, ResourceNotFound
Giới hạn số lần retryTránh rơi vào vòng lặp vô hạn
Thêm JitterNgẫu nhiên hóa delay để giảm tranh chấp
Sử dụng SDK có hỗ trợ sẵnTrá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ăngMục đích
Exponential BackoffGiảm lỗi tạm thời khi truy cập DynamoDB
JitterGiảm xung đột khi nhiều retry cùng lúc
Adaptive RetryTối ưu tự động dựa trên điều kiện mạng
SDK hỗ trợ sẵnKhông cần tự viết logic nếu không cần thiết

🔗 Tài liệu tham khảo


13 Views

Leave a Reply

Your email address will not be published. Required fields are marked *