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