DynamoDB - Penanganan Error

Jika pemrosesan permintaan tidak berhasil, DynamoDB melontarkan kesalahan. Setiap kesalahan terdiri dari komponen berikut: kode status HTTP, nama pengecualian, dan pesan. Manajemen kesalahan terletak pada SDK Anda, yang menyebarkan kesalahan, atau kode Anda sendiri.

Kode dan Pesan

Pengecualian termasuk dalam kode status header HTTP yang berbeda. 4xx dan 5xx menyimpan kesalahan terkait dengan masalah permintaan dan AWS.

Pilihan pengecualian dalam kategori HTTP 4xx adalah sebagai berikut -

  • AccessDeniedException - Klien gagal menandatangani permintaan dengan benar.

  • ConditionalCheckFailedException - Kondisi dievaluasi sebagai salah.

  • IncompleteSignatureException - Permintaan tersebut menyertakan tanda tangan yang tidak lengkap.

Pengecualian dalam kategori HTTP 5xx adalah sebagai berikut -

  • Kesalahan server dari dalam
  • Layanan tidak tersedia

Coba Lagi dan Algoritme Mundur

Kesalahan berasal dari berbagai sumber seperti server, sakelar, penyeimbang beban, dan bagian lain dari struktur dan sistem. Solusi umum terdiri dari percobaan ulang sederhana, yang mendukung keandalan. Semua SDK menyertakan logika ini secara otomatis, dan Anda dapat menyetel parameter coba lagi agar sesuai dengan kebutuhan aplikasi Anda.

For example - Java menawarkan nilai maxErrorRetry untuk menghentikan percobaan ulang.

Amazon merekomendasikan penggunaan solusi backoff selain percobaan ulang untuk mengontrol aliran. Ini terdiri dari waktu tunggu yang semakin lama antara percobaan ulang dan akhirnya berhenti setelah waktu yang cukup singkat. Catatan SDK melakukan percobaan ulang otomatis, tetapi bukan backoff eksponensial.

Program berikut adalah contoh retry backoff -

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