DynamoDB - การเขียนแบทช์

การเขียนแบทช์ทำงานกับหลายรายการโดยการสร้างหรือลบหลายรายการ การดำเนินการเหล่านี้ใช้BatchWriteItemซึ่งมีข้อ จำกัด ไม่เกิน 16MB เขียนและ 25 คำขอ แต่ละรายการมีขนาด จำกัด 400KB การเขียนแบทช์ยังไม่สามารถทำการอัพเดตไอเท็มได้

Batch Writing คืออะไร?

การเขียนแบทช์สามารถจัดการกับรายการในหลาย ๆ ตาราง การเรียกใช้การดำเนินการเกิดขึ้นสำหรับแต่ละคำขอซึ่งหมายความว่าการดำเนินการจะไม่ส่งผลกระทบต่อกันและอนุญาตให้มีการผสมที่แตกต่างกันได้ ตัวอย่างเช่นหนึ่งPutItem และสาม DeleteItemคำขอเป็นชุดโดยที่คำขอ PutItem ล้มเหลวจะไม่ส่งผลกระทบต่อผู้อื่น คำขอที่ล้มเหลวส่งผลให้การดำเนินการส่งคืนข้อมูล (คีย์และข้อมูล) ที่เกี่ยวข้องกับแต่ละคำขอที่ล้มเหลว

Note- หาก DynamoDB ส่งคืนรายการใด ๆ โดยไม่ได้ประมวลผลให้ลองอีกครั้ง อย่างไรก็ตามให้ใช้วิธีการสำรองเพื่อหลีกเลี่ยงความล้มเหลวของคำขออื่นเนื่องจากการบรรทุกเกินพิกัด

DynamoDB ปฏิเสธการดำเนินการเขียนแบบแบตช์เมื่อหนึ่งหรือหลายข้อความต่อไปนี้พิสูจน์ว่าเป็นจริง -

  • คำขอเกินปริมาณงานที่จัดเตรียมไว้

  • คำขอพยายามใช้ BatchWriteItems เพื่ออัปเดตรายการ

  • คำขอดำเนินการหลายอย่างในรายการเดียว

  • ไม่มีตารางคำขอ

  • แอตทริบิวต์รายการในคำขอไม่ตรงกับเป้าหมาย

  • คำขอมีขนาดเกินขีด จำกัด

การเขียนแบบกลุ่มต้องมีบางอย่าง RequestItem พารามิเตอร์ -

  • จำเป็นต้องดำเนินการลบ DeleteRequest สำคัญ subelements หมายถึงชื่อแอตทริบิวต์และค่า

  • PutRequest รายการที่ต้องการ Item subelement หมายถึงแผนผังแอตทริบิวต์และแอตทริบิวต์

Response - การดำเนินการที่ประสบความสำเร็จส่งผลให้ได้รับการตอบสนอง HTTP 200 ซึ่งระบุลักษณะเช่นหน่วยความจุที่ใช้เมตริกการประมวลผลตารางและรายการที่ยังไม่ได้ประมวลผล

Batch เขียนด้วย Java

ดำเนินการเขียนแบตช์โดยสร้างอินสแตนซ์คลาส DynamoDB, a TableWriteItems อินสแตนซ์คลาสที่อธิบายการดำเนินการทั้งหมดและการเรียกใช้ batchWriteItem วิธีการใช้วัตถุ TableWriteItems

Note- คุณต้องสร้างอินสแตนซ์ TableWriteItems สำหรับทุกตารางในชุดงานที่เขียนลงในหลายตาราง นอกจากนี้ตรวจสอบการตอบกลับคำขอของคุณสำหรับคำขอที่ยังไม่ได้ประมวลผล

คุณสามารถตรวจสอบตัวอย่างการเขียนแบทช์ต่อไปนี้ -

DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient( 
   new ProfileCredentialsProvider()));  

TableWriteItems forumTableWriteItems = new TableWriteItems("Forum") 
   .withItemsToPut( 
   new Item() 
   .withPrimaryKey("Title", "XYZ CRM") 
   .withNumber("Threads", 0));  

TableWriteItems threadTableWriteItems = new TableWriteItems(Thread) 
   .withItemsToPut( 
   new Item() 
   .withPrimaryKey("ForumTitle","XYZ CRM","Topic","Updates") 
   .withHashAndRangeKeysToDelete("ForumTitle","A partition key value", 
   "Product Line 1", "A sort key value"));

BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem (
   forumTableWriteItems, threadTableWriteItems);

โปรแกรมต่อไปนี้เป็นอีกตัวอย่างที่ใหญ่กว่าสำหรับการทำความเข้าใจวิธีที่แบตช์เขียนด้วย Java

Note- ตัวอย่างต่อไปนี้อาจถือว่าเป็นแหล่งข้อมูลที่สร้างขึ้นก่อนหน้านี้ ก่อนที่จะพยายามดำเนินการให้จัดหาไลบรารีที่สนับสนุนและสร้างแหล่งข้อมูลที่จำเป็น (ตารางที่มีคุณสมบัติที่ต้องการหรือแหล่งอ้างอิงอื่น ๆ )

ตัวอย่างนี้ยังใช้ Eclipse IDE, ไฟล์ข้อมูลรับรอง AWS และ AWS Toolkit ภายใน Eclipse AWS Java Project

package com.amazonaws.codesamples.document;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.BatchWriteItemOutcome;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.TableWriteItems;
import com.amazonaws.services.dynamodbv2.model.WriteRequest;

public class BatchWriteOpSample {  
   static DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient( 
      new ProfileCredentialsProvider()));  
   static String forumTableName = "Forum"; 
   static String threadTableName = "Thread";  
      
   public static void main(String[] args) throws IOException { 
      batchWriteMultiItems();   
   }
   private static void batchWriteMultiItems() { 
      try {
         // Place new item in Forum 
         TableWriteItems forumTableWriteItems = new TableWriteItems(forumTableName) 
                                                                       //Forum 
            .withItemsToPut(new Item() 
            .withPrimaryKey("Name", "Amazon RDS") 
            .withNumber("Threads", 0));  
            
         // Place one item, delete another in Thread 
         // Specify partition key and range key 
         TableWriteItems threadTableWriteItems = new TableWriteItems(threadTableName) 
            .withItemsToPut(new Item() 
            .withPrimaryKey("ForumName","Product  
            Support","Subject","Support Thread 1") 
            .withString("Message", "New OS Thread 1 message")
            .withHashAndRangeKeysToDelete("ForumName","Subject", "Polymer Blaster", 
            "Support Thread 100"));  
            
         System.out.println("Processing request..."); 
         BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem (
               forumTableWriteItems, threadTableWriteItems);
         do {  
            // Confirm no unprocessed items 
            Map<String, List<WriteRequest>> unprocessedItems 
               = outcome.getUnprocessedItems();  
                  
            if (outcome.getUnprocessedItems().size() == 0) { 
               System.out.println("All items processed."); 
            } else { 
               System.out.println("Gathering unprocessed items..."); 
               outcome = dynamoDB.batchWriteItemUnprocessed(unprocessedItems); 
            }  
         } while (outcome.getUnprocessedItems().size() > 0);  
      } catch (Exception e) { 
         System.err.println("Could not get items: "); 
         e.printStackTrace(System.err); 
      }   
   } 
}