DynamoDB - การจัดการข้อผิดพลาด

ในการประมวลผลคำขอไม่สำเร็จ DynamoDB จะแสดงข้อผิดพลาด ข้อผิดพลาดแต่ละข้อประกอบด้วยส่วนประกอบต่อไปนี้: รหัสสถานะ HTTP ชื่อข้อยกเว้นและข้อความ การจัดการข้อผิดพลาดขึ้นอยู่กับ SDK ของคุณซึ่งเผยแพร่ข้อผิดพลาดหรือรหัสของคุณเอง

รหัสและข้อความ

ข้อยกเว้นอยู่ในรหัสสถานะส่วนหัว HTTP ที่แตกต่างกัน 4xx และ 5xx ถือข้อผิดพลาดที่เกี่ยวข้องกับปัญหาการร้องขอและ AWS

การเลือกข้อยกเว้นในประเภท HTTP 4xx มีดังนี้ -

  • AccessDeniedException - ลูกค้าลงนามในคำขอไม่ถูกต้อง

  • ConditionalCheckFailedException - เงื่อนไขที่ประเมินเป็นเท็จ

  • IncompleteSignatureException - คำขอมีลายเซ็นที่ไม่สมบูรณ์

ข้อยกเว้นในประเภท HTTP 5xx มีดังนี้ -

  • ข้อผิดพลาดภายในเซิร์ฟเวอร์
  • ไม่สามารถให้บริการได้

Retries และ Backoff Algorithms

ข้อผิดพลาดมาจากหลายแหล่งเช่นเซิร์ฟเวอร์สวิตช์ตัวโหลดบาลานเซอร์และโครงสร้างและระบบอื่น ๆ โซลูชันทั่วไปประกอบด้วยการลองใหม่อย่างง่ายซึ่งรองรับความน่าเชื่อถือ SDK ทั้งหมดรวมตรรกะนี้โดยอัตโนมัติและคุณสามารถตั้งค่าพารามิเตอร์การลองใหม่เพื่อให้เหมาะกับความต้องการของแอปพลิเคชันของคุณ

For example - Java เสนอค่า maxErrorRetry เพื่อหยุดการลองใหม่

Amazon แนะนำให้ใช้โซลูชันแบ็กออฟนอกเหนือจากการลองใหม่เพื่อควบคุมโฟลว์ ซึ่งประกอบด้วยระยะเวลารอที่เพิ่มขึ้นเรื่อย ๆ ระหว่างการลองใหม่และในที่สุดก็หยุดลงหลังจากช่วงเวลาสั้น ๆ หมายเหตุ SDK ทำการลองใหม่โดยอัตโนมัติ แต่ไม่ใช่การย้อนกลับแบบเอ็กซ์โปเนนเชียล

โปรแกรมต่อไปนี้เป็นตัวอย่างของการย้อนกลับของการลองอีกครั้ง -

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; 
}