icon / menu / white V2Created with Sketch.
Switch LanguageSwitch Language
ไทย
รวมศูนย์ข้อมูลด้วย DynamoDB Streams

รวมศูนย์ข้อมูลด้วย DynamoDB Streams

DynamoDB คือเซอร์วิสฐานข้อมูลประเภทที่ไม่ไม่ต้องอาศัย SQL (NoSQL database service) ที่ให้บริการโดย Amazon Web Services (AWS) หากจะเทียบกับ relational database ต่างๆ แล้ว ตารางบน NoSQL database นั้นไม่ได้ถูกจำกัดอยู่ใต้โครงสร้างใดโครงสร้างหนึ่งเพียงอย่างเดียว ข้อดีนี้ทำให้ทีมพัฒนาปรับเปลี่ยนฐานข้อมูลไปตามความต้องการที่เปลี่ยนแปลงไปได้ NoSQL database ยังสามารถขยายตัวในแนวราบได้ เพราะเอกสารต่างๆ มีการเก็บบันทึกฐานข้อมูลในตัวเองอยู่แล้ว (Self-contained) ดังนั้น เซอร์วิสแบบนี้จึงทำให้องค์กรทำงานร่วมกับ data set ขนาดใหญ่ได้ดี

ด้วยความเป็น NoSQL database บริการของ DynamoDB มอบประโยชน์ดังต่อไปนี้

  • ลดความเสียเวลาในการดำเนินการโดยมอบความสามารถด้าน hardware provisioning และ replication
  • สามารถขยายออกในแนวราบแบบ linear ด้วยการจัดการ partition และการทำ load-balancing
  • การเข้ารหัสในระดับ REST functionality เพื่อปกป้องข้อมูลสำคัญ
  • เวลาในการนำออกใช้งานไปจนถึงการเลือกตั้งเวลาให้ข้อมูลหมดอายุ และลดปริมาณการจัดเก็บข้อมูล

อย่างไรก็ตาม DynamoDB สนับสนุนเฉพาะ key-value query เท่านั้น การที่เซอร์วิสนี้ไม่สนับสนุน SQL functions เช่น triggers, group by และ joins ทำให้เกิดความท้าทายสำหรับการนำไปพัฒนาผลิตภัณฑ์ที่ต้องรองรับการวิเคราห์เชิง analytics, การสรุปผลแบบ summary หรือการรวมศูนย์ข้อมูลย้อนหลังทั่งหมดเข้ามาอยู่รวมกัน

โชคดีที่ AWS เสนอเซอร์วิสชื่อ DynamoDB Streams เพิ่มเติมไว้ด้วย โดยบทความนี้ เราจะมาดูกันว่า DynamoDB Streams นั้นถูกนำมาใช้เพื่อทำงานรอบๆ ข้อจำกัดนี้ในสถานการณ์ต่างๆ ได้อย่างไร ซึ่งสุดท้ายแล้วจะทำให้ผู้ใช้ปลายทางติดตามข้อมูลที่ถูกรวมศูนย์ไว้ (aggregated data) เพื่อนำมาใช้ประกอบการตัดสินใจได้อย่างไร


ความสามารถของ DynamoDB Streams

DynamoDB Streams คือเซอร์วิสที่สามารถส่งข้อมูลการปรับเปลี่ยนที่เกิดขึ้นแบบ time-ordered series ในตารางของ DynamoDB table ไปยังผู้ใช้คนอื่นๆ ได้ ลักษณะของเซอร์วิสนี้ทำให้ข้อมูลจากตารางต้นทาง (Source Table) ถูกประมวลผลในเซอร์วิสอื่นๆ ได้

กระบวนการที่นิยมใช้ในการประมวลผลข้อมูลประเภท stream records นี้นั้นจะทำผ่านทาง AWS Lambda function เมื่อตั้งค่าแล้ว AWS จะเปิดฟังก์ชั่นนี้ให้ทำงานเมื่อไรก็ตามที่มีการทำงาน mutating action (เช่น InSERT, MODIFY หรือ REMOVE) บน source table นอกจากนี้ ยังมีตัวเลือกให้ฟังก์ชั่นดังกล่าวรับ snapshot สำหรับ mutated row ใน source table ก่อนและ/หรือ หลังจากการทำงาน action นั้นแล้วด้วย

Blog_Aggregating_Data_Streams_DynamoDBStreams_1

ด้วยการใช้งานเซอร์วิสนี้ เราสามารถใช้ Snapshot และอัพเดทข้อมูล aggregated data ในตาราง AWS DynamoDB table อื่นๆ ผ่านทางฟังก์ชั่น AWS Lambda function ได้ด้วย


กรณีการใช้

ลองดูที่ตัวอย่างการใช้งานที่เราใช้ AWS DynamoDB table ที่มีการ insert ข้อมูล record ทุกครั้งที่มีการสแกนไฟล์เข้ามาโดยแอปพลิเคชั่น ทีมของโครงการนี้จึงได้เลือก AWS DynamoDB เพราะไม่ต้องการที่จะต้องคอยบริหารจัดการดูแลเซิร์ฟเว่อร์เอง พวกเขายังเลือกใช้เซอร์วิสนี้เพราะจำเป็นที่จะต้อง integrate แอปพลิเคชั่นเข้ากีบเซอร์วิสอื่นๆ บน AWS ด้วย

Blog_Aggregating_Data_Streams_DynamoDBStreams_2

มีคำร้องขอเพิ่ม new feature request ให้สามารถเรียกดูจำนวนของครั้งที่ไฟล์ถูกสแกนในแต่ละเดือนแยกตามรายต่อโครงการได้รับการส่งมาจาก product owner ส่วน users นั้นต้องการฟีเจอร์นี้ในแอปพลิเคชั่นเพื่อที่จะสามารถตรวจตราโควต้าที่ได้ถูกใช้ไปในแต่ละเดือน

เพื่อให้บรรลุเป้าหมายนี้ เราจะต้องสร้าง DynamoDB table อีกชุดพร้อมด้วย schema ต่อไปนี้

Blog_Aggregating_Data_Streams_DynamoDBStreams_3

เราต้องเปิด DynamoDB Streams บน source table แล้วเลือก New Image และเนื่องจาก records ไม่ได้ถูกปรับแต่งหรือลบออกในตัวอย่างนี้ เราจะทำแค่การ snapshot ของ row หลังจากที่มีการ insert เพิ่มเข้าไปแล้ว

Blog_Aggregating_Data_Streams_DynamoDBStreams_4

จากนั้น เราต้องสร้าง AWS Lambda function ใหม่ พร้อมมอบ IAM permissions ที่จำเป็นต่อการ read and write ตาราง DynamoDB tables ที่ต้องใช้ แล้วจากนั้นตั้งค่าให้ถูก trigger โดย DynamoDB Streams ต่อไป

Blog_Aggregating_Data_Streams_DynamoDBStreams_5

เมื่อ record ใหม่ถูก insert เข้าไปใน source table แล้ว AWS Lambda function จะถูกเรียกโดย event body ที่คล้ายกับโครงสร้างต่อไปนี้

Blog_Aggregating_Data_Streams_DynamoDBStreams_6.jpg

สุดท้าย เพื่อทำการอัพเดทตาราง aggregated table เราจำเป็นต้องสร้าง AWS Lambda function พร้อมกับ layer และ packages ที่สอดคล้องเหมาะสม เพื่อ deploy ชุดคำสั่งตาม code ต่อไปนี้

Blog_Aggregating_Data_Streams_DynamoDBStreams_7.jpg


วิธีปฏิบัติที่แนะนำ

การติดตั้งใช้งานนี้เป็นโซลูชั่นอย่างง่ายตามที่ยกตัวอย่างไปข้างต้น เพื่อให้ใช้ประโยชน์จากความสามารถของ DynamoDB Streams ได้ทั่วถึงกันทุกโครงการ จึงขอกล่าวถึงประเด็นพิจารณาต่อไปนี้

การจัดการ Error

DynamoDB Streams อาจจะ resend ชุดของข้อมูลใหม่อีกรอบ ถ้าการทำงานของ AWS Lambda function ล้มเหลว เพื่อป้องกันเหตุการณ์นี้ ให้ตั้งค่ากลไก try-catch mechanism ในชุดคำสั่งของ AWS Lambda function code จากนั้นบันทึก Log errors และแจ้ง system admin หรือ developer แล้วจัดเก็บ stream data ไว้ใน dead letter queue เช่น SQS หรือ S3 ในกรณีที่มี event of failure หนึ่งๆ ขึ้นมา และอย่าลืมเก็บค่า batch size ไว้ที่ 1 ด้วย นั่นอาจจะลดประสิทธิภาพการทำงาน แต่จะลดความเสี่ยงของการสูญเสียข้อมูลตลอดจนเกิดความง่ายขึ้นในการส่ง troubleshoot ด้วย

การจำกัด Throughput

หากต้องการตั้งค่าเพื่อลด Throughput ไว้เพื่อเป็นค่ายกเว้นบน DynamoDB เราจะสามารถเขียน Throughput capacity ของ DynamoDB table ที่รวมเอาไว้ได้มากกว่าแค่ตัว source table อย่างเดียว นอกจากนี้ยังช่วยให้หลีกเลี่ยงการเผลอไปเขียน batch write ไว้บน source table ได้ด้วย การทำ single batch บน source table จะก่อให้เกิด multiple events บน DynamoDB stream ขึ้นมาได้ ความจุของ Throughput capacity ของตัว DynamoDB table ที่รวมเอาไว้นั้นจะต้องเป็น set ที่สอดคล้องตามเงื่อนไข maximum number ของ records ที่ถูกเขียนยน batch write ในอีกทางเลือกหนึ่งนั้นหากมีความยากในการที่จะคาดการณ์หรือควบคุม application traffic ได้ ให้ตั้งค่า Throughput capacity ของ DynamoDB table ที่รวมเอาไว้เป็นแบบ On-demand แทน

การอัพเดทค่า Expression

การเปิดใช้งาน Multiple Lambda functions ในเวลาเดียวกันอาจจะไป overwrite แต่ละค่า aggregated values ที่รวมเอาไว้ได้แบบต่อเนื่องเลยทีเดียว เหตุการณ์นี้จะเกิดขึ้นหาก logic ของตัวโค้ดเองบน Lambda function ถูกตั้งไว้ให้ไป look up ค่า aggregate count เดิมก่อนการอัพเดทนั่นเอง เพื่อเป็นการป้องกันเหตุการณ์นี้ไม่ให้เกิดขึ้น ให้ใช้ ‘UpdateExpression’ ของตัว DynamoDB client ตามที่แสดงในตัวอย่างโค้ด เพื่อเพิ่มเข้าไปในค่าเดิมโดยที่ไม่ต้องทำการ look up ในระดับของ code layer

การค้นหาแบบ Elasticsearch

ลองสมมติว่ามีคำร้อง Feature request ให้เพิ่มฟังก์ชั่นการเรียกดูการรวมศูนย์ข้อมูลแบบรายปี (Yearly Aggregation) จากตัวอย่างก่อนหน้านี้ นั่นหมายความว่าอีก table หนึ่งจะต้องถูกสร้างขึ้นและได้รับการถูก streamed จากตาราง aggreation table แบบรายเดือนก่อน เพราะ DynamoDB นั้นไม่ได้ถูกออกแบบมาเพื่อค้นหาข้อมูลในปริมาณมากๆ และอาจจะไม่รองรับความสามารถในการค้นหาที่มีเงื่อนไขซับซ้อนได้

อีกทางเลือกหนึ่งสำหรับกรณีนี้นั้น คือการทำ index ให้กับ items ต่างๆ บน Amazon Elasticsearch Service cluster จากตัว DynamoDB stream เลย เพราะ Elasticsearch นั้นรองรับทั้งการค้นหาและการควบรวมได้ทั้งสองอย่าง เมื่อเทียบกับการบันทึกข้อมูล aggregated data เข้าไปใน DynamoDB table อื่นๆ แล้ว วิธีการนี้อาจจะมีความครอบคลุมมากกว่า หากฟังก์ชั่นการค้นหา หรือการออกรายงานแบบ multiple aggregated reports นั้นเป็นเรื่องที่ต้องทำหรือคาดหวังไว้ว่าจะต้องมี ทาเงลือกนี้จึงน่าจะเหมาะสมที่สุด 

Blog_Aggregating_Data_Streams_DynamoDBStreams_8

 

สรุป

AWS DynamoDB มีประโยชน์มากมาย เช่น การลดภาระการดำเนินงานและการมอบความสามารถในการขยายตัวและมีความยืดหยุ่นสูง การขาดการรองรับฟังก์ชั่น SQL อาจจะสร้างความท้าทายในการจัดการ query แบบซับซ้อนได้ แต่ DynamoDB Streams เข้ามาช่วยแก้ไขความท้าทายที่พบนี้ได้ และยังช่วยให้นักพัฒนาสามารถขยายและรวม AWS DynamoDB เข้ากับเซอร์วิสอื่นๆ ได้อีกด้วย ทีมนักพัฒนายังสามารถพัฒนาโซลูชั่นเพื่อรองรับการค้นหาข้อมูลอย่างเช่น data aggregation และ analytics ได้ ดังนั้นจึงช่วยให้ผู้ใช้ปลายทางสามารถตัดสินใจในเรื่องต่างๆ บนพื้นฐานของข้อมูลที่มีพร้อมในการขอดูได้ด้วยเช่นกัน

Related articles

รวมศูนย์ข้อมูลด้วย DynamoDB Streams
2 mins
เครื่องมือสำหรับ Developer
รวมศูนย์ข้อมูลด้วย DynamoDB Streams

Button / CloseCreated with Sketch.