Streaming data กับ DynamoDB

การพัฒนาแอปพลิเคชันบน AWS

Ricardo Sueiras

Principal Technologist

พื้นฐาน DynamoDB Streams

 

fundamentals

  • ตอบสนองต่อการเปลี่ยนแปลงในฐานข้อมูลแบบใกล้เคียงเรียลไทม์
  • สร้างบน event-driven patterns
  • ทุกการ insert, modify หรือ delete จะสร้าง stream record
  • สร้างแอปแบบ reactive ได้โดยไม่ต้อง polling ตาราง
  • ปิดใช้งานโดยค่าเริ่มต้น: เปิดใช้ด้วย StreamSpecification
  • แต่ละ stream มี ARN เป็นของตัวเอง แยกจาก ARN ของตาราง
การพัฒนาแอปพลิเคชันบน AWS

ระยะเวลาการเก็บข้อมูล

 

retention

  • Stream records จะถูกเก็บไว้นาน 24 ชั่วโมง
    • ระยะเวลาเก็บข้อมูลนี้คงที่ ปรับแต่งไม่ได้
  • การเปลี่ยน view type ต้องสร้าง stream ใหม่
    • Stream ใหม่จะได้รับ stream ARN ใหม่
การพัฒนาแอปพลิเคชันบน AWS

Streams กับ read capacity units ของ DynamoDB

 

rcu

  • การอ่าน stream ไม่ใช้ read capacity units (RCUs)
  • การเปิดใช้ streams ไม่กระทบ provisioned throughput
การพัฒนาแอปพลิเคชันบน AWS

Stream records

  • แต่ละ stream record มี metadata อธิบายการเปลี่ยนแปลง
  • Streams รองรับ event 3 ประเภท:
    • INSERT
    • MODIFY
    • REMOVE

 

stream records

การพัฒนาแอปพลิเคชันบน AWS
  • View type กำหนดว่าข้อมูลใดจะอยู่ใน record
    • KEYS_ONLY: เฉพาะ partition key และ sort key
    • NEW_IMAGE: ข้อมูล item ทั้งหมดหลังการเปลี่ยนแปลง
    • OLD_IMAGE: ข้อมูล item ทั้งหมดก่อนการเปลี่ยนแปลง
    • NEW_AND_OLD_IMAGES: ข้อมูล item ก่อนและหลัง
  • NEW_AND_OLD_IMAGES เหมาะสำหรับการ auditing
  • จำเป็นสำหรับ DynamoDB Global Tables

stream views

การพัฒนาแอปพลิเคชันบน AWS
  • Streams รักษาลำดับตาม partition key
  • Lambda ประมวลผล record เป็น batch
    • บันทึก checkpoint หลัง batch สำเร็จแต่ละครั้ง
    • batch ที่ล้มเหลวจะถูก retry
    • retry ต่อเนื่องจนกว่าจะสำเร็จหรือ record หมดอายุ

 

ordering

การพัฒนาแอปพลิเคชันบน AWS

 

streams and aws lambda

  • Lambda เป็น stream consumer ที่ใช้งานบ่อยที่สุด
  • ใช้ polling-based event source mapping
  • อ่าน record จาก stream
  • เรียกใช้ฟังก์ชันพร้อม batch ของ record
การพัฒนาแอปพลิเคชันบน AWS

รูปแบบสถาปัตยกรรม

 

arch patterns

  • รูปแบบ end-to-end ที่พบบ่อย:
    • item มีการอัปเดตใน DynamoDB
    • การเปลี่ยนแปลงสร้าง stream record
    • record ทริกเกอร์ Lambda เพื่อประมวลผล
การพัฒนาแอปพลิเคชันบน AWS

การ Scaling

 

scaling

  • Streams แบ่งภายในเป็น shard
    • คล้ายกับ Kinesis Data Streams
  • แต่ละ shard รองรับ consumer พร้อมกันได้สูงสุด 2 ราย
    • เกินขีดจำกัดนี้เป็นสาเหตุหลักของ read throttling
การพัฒนาแอปพลิเคชันบน AWS
  • Lambda concurrency ปรับขนาดตามจำนวน shard
  • ปรับแต่งการประมวลผลด้วย:
    • BatchSize: จำนวน record สูงสุดต่อการเรียกใช้
    • MaximumBatchingWindow: เวลารอก่อนส่ง batch ที่ยังไม่ครบ
    • MaximumRetryAttempts: จำนวน retry ก่อนส่งไป failure destination
    • MaximumRecordAgeInSeconds: ละทิ้ง record ที่เกินอายุที่กำหนด
    • ParallelizationFactor: การประมวลผลพร้อมกันต่อ shard (สูงสุด 10)

scaling with lambda

การพัฒนาแอปพลิเคชันบน AWS

Filtering และ tumbling windows

  • Lambda รองรับ filter criteria
    • ละทิ้ง record ก่อนเรียกใช้ฟังก์ชัน
    • ลดการเรียกใช้ที่ไม่จำเป็นและลดต้นทุน
  • Lambda รองรับ tumbling windows
    • รวม state ข้าม batch ใน shard

 

filtering and tumbling windows

การพัฒนาแอปพลิเคชันบน AWS

การจัดการ record ที่ซ้ำกัน

  • Streams บันทึกการเปลี่ยนแปลงแต่ละครั้งเพียงครั้งเดียว
  • Lambda ประมวลผล record แบบ at-least-once
    • การ retry อาจประมวลผล record เดิมซ้ำ
  • ออกแบบ consumer ให้เป็น idempotent
  • รูปแบบที่นิยม: เก็บ eventID หรือ SequenceNumber ที่ประมวลผลแล้ว
    • ข้าม record ที่จัดการไปแล้ว
    • ทั้งสองค่าคงที่ข้าม retry
    • เป็น idempotency key ที่เชื่อถือได้

 

managing duplicate records

การพัฒนาแอปพลิเคชันบน AWS

การจัดการความล้มเหลว

 

handling failures

  • ReportBatchItemFailures retry เฉพาะ record ที่ล้มเหลว
  • จัดการความล้มเหลวของ Lambda ด้วย:
    • BisectBatchOnFunctionError สำหรับการแบ่ง batch
    • การควบคุม retry
    • Failure destinations สำหรับ batch ที่ retry จนหมดรอบ
การพัฒนาแอปพลิเคชันบน AWS

การผสาน DynamoDB กับ Kinesis

 

integration

  • ตารางสามารถส่งการเปลี่ยนแปลงตรงไปยัง Kinesis Data Streams
    • ผ่านฟีเจอร์ Kinesis Data Streams for DynamoDB
    • เป็นความสามารถแยกต่างหาก ไม่ใช่การต่อกันเป็นลูกโซ่
    • Event ไม่ไหลผ่าน DynamoDB Streams
  • ทั้งสองทำงานบนตารางเดียวกันพร้อมกันได้
    • ทำงานอิสระจากกัน
    • รองรับสถาปัตยกรรม streaming และ analytics ที่กว้างขึ้น
การพัฒนาแอปพลิเคชันบน AWS

การ Monitoring: ปัญหาที่พบบ่อย

 

troubleshooting

  • ปัญหาด้านการใช้งานที่พบบ่อย:
    • Hot partitions
    • การ retry ที่ล้มเหลว
    • การประมวลผลซ้ำ
    • Throttling และ consumer lag
การพัฒนาแอปพลิเคชันบน AWS

การ Monitoring: metric ของ CloudWatch

  • metric ของ CloudWatch ที่ควรติดตาม:
    • Lambda Errors: แสดงปัญหาใน code หรือระบบปลายทาง
    • IteratorAge: ค่าสูงบ่งชี้ว่า consumer ทำงานช้า
    • Throttling metrics: ขีดจำกัดการอ่านถูกเกิน
    • Batch processing failures: record ถูกส่งไป DLQ

 

troubleshooting

การพัฒนาแอปพลิเคชันบน AWS

ความปลอดภัย

  • การเข้าถึง streams ควบคุมด้วยสิทธิ์ IAM
  • Streams รับการตั้งค่าการเข้ารหัสมาจากตาราง
    • รวมถึง server-side encryption ที่พักด้วย KMS
  • ใช้ least-privilege policy กับ consumer และ downstream processor

 

security

การพัฒนาแอปพลิเคชันบน AWS

มาฝึกกันเถอะ!

การพัฒนาแอปพลิเคชันบน AWS

Preparing Video For Download...