DynamoDB - Xử lý lỗi

Khi xử lý yêu cầu không thành công, DynamoDB sẽ thông báo lỗi. Mỗi lỗi bao gồm các thành phần sau: mã trạng thái HTTP, tên ngoại lệ và thông báo. Việc quản lý lỗi nằm trên SDK của bạn, SDK này sẽ truyền lỗi hoặc mã của riêng bạn.

Mã và tin nhắn

Các trường hợp ngoại lệ rơi vào các mã trạng thái tiêu đề HTTP khác nhau. 4xx và 5xx giữ lại các lỗi liên quan đến các vấn đề yêu cầu và AWS.

Lựa chọn các ngoại lệ trong danh mục HTTP 4xx như sau:

  • AccessDeniedException - Khách hàng không thể ký yêu cầu một cách chính xác.

  • ConditionalCheckFailedException - Một điều kiện được đánh giá là sai.

  • IncompleteSignatureException - Yêu cầu bao gồm một chữ ký không đầy đủ.

Các ngoại lệ trong danh mục HTTP 5xx như sau:

  • Lỗi máy chủ nội bộ
  • dịch vụ Không sẵn có

Thử lại và thuật toán dự phòng

Lỗi đến từ nhiều nguồn khác nhau như máy chủ, thiết bị chuyển mạch, bộ cân bằng tải và các phần khác của cấu trúc và hệ thống. Các giải pháp phổ biến bao gồm các lần thử lại đơn giản, hỗ trợ độ tin cậy. Tất cả các SDK đều tự động bao gồm logic này và bạn có thể đặt các thông số thử lại cho phù hợp với nhu cầu ứng dụng của mình.

For example - Java cung cấp giá trị maxErrorRetry để dừng thử lại.

Amazon khuyến nghị sử dụng giải pháp dự phòng bên cạnh việc thử lại để kiểm soát luồng. Điều này bao gồm khoảng thời gian chờ tăng dần giữa các lần thử lại và cuối cùng dừng lại sau một khoảng thời gian khá ngắn. Lưu ý SDK thực hiện thử lại tự động, nhưng không thực hiện lại theo cấp số nhân.

Chương trình sau là một ví dụ về quá trình thử lại:

public enum Results { 
   SUCCESS,  
   NOT_READY,  
   THROTTLED,  
   SERVER_ERROR 
}
public static void DoAndWaitExample() {  
   try {
      // asynchronous operation. 
      long token = asyncOperation();  
      int retries = 0; 
      boolean retry = false;  
      
      do { 
         long waitTime = Math.min(getWaitTime(retries), MAX_WAIT_INTERVAL);  
         System.out.print(waitTime + "\n");  
         
         // Pause for result 
         Thread.sleep(waitTime);  
         
         // Get result 
         Results result = getAsyncOperationResult(token);  
         
         if (Results.SUCCESS == result) { 
            retry = false; 
         } else if (Results.NOT_READY == result) { 
            retry = true; 
         } else if (Results.THROTTLED == result) { 
            retry = true; 
         } else if (Results.SERVER_ERROR == result) { 
            retry = true; 
         } else { 
            
            // stop on other error 
            retry = false; 
         }  
      } while (retry && (retries++ < MAX_RETRIES)); 
   }
   catch (Exception ex) { 
   } 
}
public static long getWaitTime(int retryCount) {  
   long waitTime = ((long) Math.pow(3, retryCount) * 100L);  
   return waitTime; 
}