เริ่มต้นกับรูปแบบการออกแบบ Event Driven ของ Amazon S3

PlAwAnSaI

Administrator
Program Event Driven ใช้เหตุการณ์ต่างๆ เพื่อเริ่มต้นขั้นตอนต่อไปในกระบวนการ ตัวอย่างเช่น การ Upload File เสร็จสิ้นอาจเป็นตัวเริ่มต้นงานประมวลผลภาพ วิธีนี้ช่วยให้นักพัฒนาสามารถสร้างสถาปัตยกรรมที่ซับซ้อนโดยใช้หลักการของ การแยกการเชื่อมต่อ (Decoupling) ซึ่งเป็นสิ่งที่ต้องการสำหรับ Workflow หลายประเภท เนื่องจากช่วยให้องค์ประกอบแต่ละส่วนทำงานได้อย่างอิสระ ซึ่งช่วยเพิ่มประสิทธิภาพ ตัวอย่างเช่น การประมวลผลคำสั่งซื้อใน Ecommerce, การประมวลผลภาพ, และงานแบบ Batch ที่ทำงานนานอื่นๆ

Amazon Simple Storage Service (S3) เป็น Solution การจัดเก็บข้อมูลแบบ Object จาก Amazon Web Services (AWS) ที่ช่วยให้คุณสามารถจัดเก็บและเรียกใช้ข้อมูลได้ไม่จำกัดปริมาณและขนาด
Amazon S3 Event Notification ให้กลไกสำหรับผู้ใช้ในการเรียกใช้เหตุการณ์เมื่อเกิดการกระทำบางอย่างภายใน S3 bucket

ใน Post นี้ เราจะแสดงให้เห็นว่าสามารถใช้ Amazon S3 Event Notification ร่วมกับชุดบริการส่งข้อความที่ทรงพลังของ Amazon ได้อย่างไร ซึ่งจะช่วยให้สามารถนำสถาปัตยกรรม Event Driven มาใช้งานสำหรับกรณีการใช้งานทั่วไปได้หลากหลายรูปแบบ

การตั้งค่า Amazon S3 Event Notification:

ก่อนอื่นเราต้องทำความเข้าใจประเภทของเหตุการณ์ที่สามารถเริ่มต้นได้ด้วย Amazon S3 Event Notification เหตุการณ์สามารถเริ่มต้นได้จากการ Upload, การแก้ไข, การลบ Object หรือการกระทำอื่นๆ เมื่อเหตุการณ์เริ่มต้นขึ้น จะมีการสร้าง Payload ที่ประกอบด้วย Metadata ของเหตุการณ์ ซึ่งรวมถึงข้อมูลเกี่ยวกับ Object ที่เป็นต้นเหตุของเหตุการณ์นั้น

เพื่อเปิดใช้งานการแจ้งเตือน ต้องเพิ่มการกำหนดค่าการแจ้งเตือนที่ระบุเหตุการณ์ที่ต้องการให้ Amazon S3 Publish ก่อน จากนั้นระบุปลายทางที่ต้องการให้ Amazon S3 ส่งการแจ้งเตือนไป การกำหนดค่านี้จะถูกจัดเก็บไว้ใน Notification Sub-resource ซึ่งสามารถพบได้ภายใต้ Tab Properties ใน Bucket S3

Figure1-PropTab.jpg


การแจ้งเตือนเหตุการณ์สามารถเริ่มต้นได้ทุกครั้งที่มีการ Upload, แก้ไข, หรือลบ Object ขึ้นอยู่กับรายละเอียดการกำหนดค่า สามารถสร้างการกำหนดค่าการแจ้งเตือนหลายรูปแบบสำหรับสถานการณ์ที่แตกต่างกัน ตัวอย่างเช่น การกำหนดค่าหนึ่งสามารถจัดการ Object ใหม่หรือที่ถูกแก้ไข และการกำหนดค่าอีกอันหนึ่งสามารถจัดการการลบ สามารถระบุให้เหตุการณ์เริ่มต้นเฉพาะเมื่อ Object มีคำนำหน้าเฉพาะ หรือหลังจากการกู้คืน Object สำหรับรายการทั้งหมดของตัวเลือกการกำหนดค่าและประเภทเหตุการณ์ ให้อ่านเอกสารเกี่ยวกับประเภทเหตุการณ์ที่รองรับ

Figure2-Subresource.jpg


การประมวลผลแบบ Synchronous และเชื่อถือได้แบบ Point-to-point
Figure4-PTP.jpg

กรณีการใช้งานที่พบบ่อยของการประมวลผลแบบ Event-driven คือเมื่อต้องการข้อมูลที่มีความเชื่อถือได้และสามารถประมวลผลแบบ Synchronous ได้ ตัวอย่างเช่น App บนมือถือที่ประมวลผลภาพที่ผู้ใช้ทำการ Upload ขึ้นไป แล้วทำการติด Tag ภาพเหล่านั้นโดยอัตโนมัติ ด้วย Technology ปัญญาประดิษฐ์และ Machine Learning (AI/ML)
จากมุมมองด้านสถาปัตยกรรม เมื่อมีการ Upload ภาพไปยัง S3 Bucket ระบบจะสร้างการแจ้งเตือนเหตุการณ์ขึ้น ซึ่งจะเป็นตัวกระตุ้นให้ Function Lambda เริ่มทำงาน โดย Function นี้จะส่งข้อมูลของภาพที่ Upload ไปยัง Amazon Rekognition เพื่อทำการติด Tag ภาพ จากนั้นผลลัพธ์ที่ได้จาก Amazon Rekognition อาจถูกประมวลผลเพิ่มเติมโดย Function Lambda ก่อนจะจัดเก็บลงในฐานข้อมูล เช่น Amazon DynamoDB

ด้วยสถาปัตยกรรมแบบนี้ จะไม่มีการเตรียมการรองรับกรณีที่มีภาพจำนวนมากถูก Upload ไปยัง S3 Bucket พร้อมกัน หาก App ส่งคำขอไปยัง Lambda มากเกินไป เหตุการณ์ต่างๆ อาจเริ่มค้างสะสม ซึ่งอาจทำให้บางภาพไม่สามารถประมวลผลได้
เพื่อให้ Program มีความทนทานต่อความล้มเหลวมากขึ้น (Fault Tolerant) การเพิ่ม Amazon SQS เข้ามาจะช่วยได้ ด้วย

การประมวลผลแบบ Asynchronous และแบบ Queue Point-to-point
Figure5-queued.jpg

สถาปัตยกรรมที่ต้องการประมวลผลข้อมูลแบบ Asynchronous สามารถใช้รูปแบบนี้ได้ ต่อเนื่องจากตัวอย่างแรก App บนมือถืออาจมี Feature ที่เปิดให้ผู้ใช้สามารถ Upload ภาพจำนวนมากพร้อมกันได้นับพันภาพ จากนั้นระบบสามารถใช้ AWS Lambda เพื่อส่งภาพเหล่านั้นไปยัง Amazon Rekognition เพื่อทำการติด Tag ภาพ

ด้วยการใช้ Solution แบบ Asynchronous ที่อิงกับ Queue, Function Lambda สามารถดึงงานจาก Queue SQS มาประมวลผลตามจังหวะของตัวเองได้ ซึ่งช่วยให้สามารถควบคุมกระบวนการประมวลผลได้อย่างเป็นลำดับ ลดความเสี่ยงจากการรับภาระงานเกินความสามารถ
แนวทางนี้มีประโยชน์อย่างยิ่งในกรณีที่ App ต้องจัดการกับการ Upload File ที่ไม่สมบูรณ์ เช่น เมื่อการเชื่อมต่อเครือข่ายขาดหายชั่วคราว

ปัจจุบัน Amazon S3 Event Notification รองรับเฉพาะ Queue SQS แบบมาตรฐาน (Standard) เท่านั้น ยังไม่สามารถใช้งานร่วมกับ Queue แบบจัดลำดับก่อน-หลัง (FIFO) ได้ (ต้องส่งไป EventBridge ก่อน) หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการตั้งค่า S3 Event Notification โดยใช้ SQS เป็นปลายทาง สามารถศึกษาเพิ่มเติมได้จากเอกสารประกอบ
สำหรับสถาปัตยกรรมนี้ Function Lambda จำเป็นต้องมีการปรับให้สามารถจัดการกับ Payload ของข้อความที่ส่งมาจาก SQS ได้ เนื่องจากโครงสร้างของข้อมูลที่ได้รับจะมีความแตกต่างเล็กน้อยจากเนื้อหาของ Event Notification ที่สร้างโดยตรงจาก S3

การประมวลผลแบบ Parallel ด้วยสถาปัตยกรรม “Fan Out”
Figure6-FanOut.png

ในการสร้างสถาปัตยกรรมแบบ “Fan Out” ซึ่งเหตุการณ์เดียวสามารถถูกส่งต่อไปยังหลายปลายทางพร้อมกันแบบ Parallel จะใช้การรวมกันระหว่าง SNS และ SQS โดยกำหนดให้ S3 ส่ง Event Notification ไปยัง SNS Topic จากนั้นสามารถกำหนดให้กระบวนการต่างๆ หลายชุดทำงานต่อจากเหตุการณ์เดียวกันได้
รูปแบบนี้มีประโยชน์มากเมื่อต้องการประมวลผลข้อมูลวัตถุเดียวกันใน S3 แบบ Parallel หลายขั้นตอนพร้อมกัน

ตัวอย่างเช่น หากต้องการแปลงภาพต้นฉบับให้เป็นหลายขนาดความละเอียด (Resolution) สามารถสร้าง Function Lambda ขึ้นมา โดย Function นี้จะใช้รูปแบบ “Fan-Out” เพื่อประมวลผลภาพทั้งหมดในแต่ละความละเอียดพร้อมกัน
จากนั้นสามารถ Subscribe Queue SQS เข้ากับ SNS Topic ได้ ซึ่งจะช่วยให้มั่นใจว่า Event Notification ที่ส่งไปยัง SNS ได้รับการยืนยันว่าเสร็จสมบูรณ์โดย SQS เมื่อได้รับการประมวลผลโดย Function Lambda แล้ว

เพื่อขยายขอบเขตของกรณีใช้งานด้านการประมวลผลภาพให้กว้างมากขึ้น สามารถสร้าง SNS Topic หลายชุดเพื่อจัดการกับเหตุการณ์ประเภทต่างๆ ที่เกิดจาก S3 Bucket เดียวกันได้
Figure7-deleteimages.png

สถาปัตยกรรมนี้จะช่วยให้ Program สามารถจัดการกับเหตุการณ์ประเภทการสร้างหรือ Updates ให้ต่างออกไปจากเหตุการณ์การลบได้อย่างเป็นระบบ นอกจากนี้ ยังสามารถประมวลผลภาพแตกต่างกันตาม Prefix ที่ใช้ใน S3 ได้อีกด้วย

ปรับ Code ของ Function Lambda ให้สามารถจัดการกับข้อความที่ถูกส่งผ่านมาทาง SNS และ SQS ได้ เนื่องจาก Payload ของข้อความเหล่านี้จะมีโครงสร้างที่แตกต่างเล็กน้อยจาก Payload ของ S3 Event Notification โดยตรง

การแจ้งเตือนแบบ Real-time
Figure8-RTNotes.png

นอกเหนือจากการส่งข้อความระหว่าง App ด้วยกันแล้ว Amazon SNS ยังรองรับการสื่อสารระหว่าง App กับผู้ใช้งาน (App-to-Person: A2P) อีกด้วย โดย Amazon SNS สามารถส่งข้อความ SMS ไปยังผู้ใช้งานโทรศัพท์มือถือในกว่า 100 ประเทศทั่วโลก รวมถึงสามารถส่งการแจ้งเตือนแบบ Push ไปยังอุปกรณ์ Android และ Apple หรือส่ง Email ผ่าน Protocol SMTP ได้เช่นกัน
ด้วยการใช้การสื่อสารแบบ A2P การ Upload ภาพไปยัง Amazon S3 bucket สามารถสร้างการแจ้งเตือนไปยังกลุ่มผู้ใช้ผ่าน Platform A2P ของ Amazon SNS ที่ผู้ใช้เลือกได้ตามต้องการ

สรุป

ใน Post นี้ เราได้นำเสนอรูปแบบการออกแบบพื้นฐานสำหรับการพัฒนาสถาปัตยกรรมแบบ Event Driven โดยใช้ Amazon S3 Event Notification สามารถนำแนวคิดเหล่านี้ไปต่อยอดเพื่อสร้างสถาปัตยกรรมที่ซับซ้อนยิ่งขึ้นตามความต้องการของระบบ
Code:
https://aws.amazon.com/blogs/architecture/get-started-with-amazon-s3-event-driven-design-patterns
:cool:
 
Last edited:
Top