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