DynamoDB - 錯誤處理



在請求處理失敗時,DynamoDB 會丟擲一個錯誤。每個錯誤都包含以下元件:HTTP 狀態程式碼、異常名稱和訊息。錯誤管理依賴於您的 SDK,SDK 傳播錯誤,或者依賴於您自己的程式碼。

程式碼和訊息

異常屬於不同的 HTTP 頭狀態程式碼。4xx 和 5xx 包含與請求問題和 AWS 相關的錯誤。

HTTP 4xx 類別中的一些異常如下所示:

  • AccessDeniedException - 客戶端未能正確簽名請求。

  • ConditionalCheckFailedException - 條件評估為假。

  • IncompleteSignatureException - 請求包含不完整的簽名。

HTTP 5xx 類別中的異常如下所示:

  • 內部伺服器錯誤
  • 服務不可用

重試和回退演算法

錯誤來自各種來源,例如伺服器、交換機、負載均衡器以及其他結構和系統元件。常見的解決方案包括簡單的重試,這有助於提高可靠性。所有 SDK 都自動包含此邏輯,您可以設定重試引數以滿足您的應用程式需求。

例如 - 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; 
}
廣告