PlusMagi's Blog By Pitt Phunsanit Backend,Database จัดการลำดับงาน Asynchronous, Synchronous

จัดการลำดับงาน Asynchronous, Synchronous

ในฐานะ System Architect การทำความเข้าใจว่างานใดควรถูกประมวลผลแบบ Synchronous (Sync) และงานใดควรเป็น Asynchronous (Async) คือหัวใจสำคัญของการออกแบบระบบที่เสถียรและมีประสิทธิภาพสูง โดยเฉพาะอย่างยิ่งเมื่อทำงานกับฐานข้อมูลขนาดใหญ่เช่น PostgreSQL

แนวคิดนี้ไม่ได้จำกัดแค่การเขียนโปรแกรม แต่รวมถึงการจัดการ Transaction, การแจ้งเตือน (Notifications) และการประมวลผลงานเบื้องหลัง (Background Jobs) ด้วย การเลือกรูปแบบที่เหมาะสมจะช่วยลดปัญหาคอขวด (Bottleneck) และเพิ่ม Throughput ของระบบได้เป็นอย่างมาก

Synchronous (Sync) ใน PostgreSQL: การทำงานแบบรอผลลัพธ์

Synchronous หมายถึงการทำงานที่ต้องรอให้ขั้นตอนก่อนหน้าเสร็จสมบูรณ์ก่อนจึงจะเริ่มขั้นตอนถัดไปได้ นี่คือรูปแบบการทำงานที่เน้นความสม่ำเสมอของข้อมูล (Consistency) และความแน่นอน (Atomicity) ซึ่งเป็นคุณสมบัติหลักของ Transaction ใน PostgreSQL

หลักการทำงาน: เมื่อมีการรันคำสั่ง SQL ใดๆ เช่น การ INSERT ข้อมูล หรือการ UPDATE ข้อมูล ระบบจะทำการล็อก (Lock) ทรัพยากรที่เกี่ยวข้อง และจะถือว่าการทำงานนั้นยังไม่เสร็จสิ้นจนกว่าคำสั่งจะถูก COMMIT หรือเกิดข้อผิดพลาด (Rollback) ซึ่งการทำงานนี้เป็นแบบ Blocking โดยธรรมชาติ

ตัวอย่างการใช้งาน Sync (Transaction)

ตัวอย่างเช่น การโอนเงินจากบัญชี A ไปยังบัญชี B ต้องเป็นแบบ Sync เพราะเราต้องมั่นใจว่าการหักเงิน (Debit) และการเพิ่มเงิน (Credit) เกิดขึ้นตามลำดับและสำเร็จพร้อมกัน (ACID Property)

SQL

BEGIN;\n-- 1. หักเงินจากบัญชี A\nUPDATE accounts SET balance = balance - 100 WHERE account_id = 'A';\n-- 2. เพิ่มเงินเข้าบัญชี B\nUPDATE accounts SET balance = balance + 100 WHERE account_id = 'B';\nCOMMIT;

ข้อดี: รับประกันความถูกต้องของข้อมูลในทันที (Immediate Consistency) และง่ายต่อการทำความเข้าใจลำดับเหตุการณ์

ข้อเสีย: หากงานใดงานหนึ่งใช้เวลานาน (เช่น การประมวลผลข้อมูลจำนวนมาก) จะทำให้การเชื่อมต่อ (Connection) ถูกบล็อกและลดประสิทธิภาพโดยรวมของระบบ

Asynchronous (Async) ใน PostgreSQL: การทำงานแบบไม่รอผลลัพธ์

Asynchronous คือการทำงานที่สามารถส่งคำสั่งออกไปให้ระบบจัดการในพื้นหลังได้ โดยที่ระบบหลักไม่จำเป็นต้องรอผลลัพธ์ทันที รูปแบบนี้เหมาะสำหรับงานที่ใช้เวลานานและไม่ส่งผลกระทบต่อประสบการณ์ผู้ใช้หลัก (Non-critical tasks)

ใน PostgreSQL เราสามารถจำลองการทำงานแบบ Async ได้อย่างมีประสิทธิภาพโดยใช้กลไก LISTEN และ NOTIFY ซึ่งเป็นระบบ Event-Driven ที่ช่วยให้แอปพลิเคชันหลักสามารถส่งสัญญาณ (Signal) ไปให้ Worker Process อื่นๆ ประมวลผลได้โดยไม่ต้องรอการตอบกลับ

ตัวอย่างการใช้งาน Async (LISTEN/NOTIFY)

สมมติว่าเราต้องการให้เมื่อมีการสร้างคำสั่งซื้อใหม่ (Sync) ให้ระบบส่งสัญญาณไปให้ Worker Process อื่นๆ ไปทำการส่งอีเมลแจ้งลูกค้า (Async) โดยที่ Transaction หลักไม่ถูกบล็อก

SQL

-- 1. ฝั่ง Transaction หลัก (Sender)\nINSERT INTO orders (status) VALUES ('PENDING');\nNOTIFY order_channel, 'order_created:123'; -- ส่งสัญญาณออกไป\n-- Transaction นี้สามารถ COMMIT ได้ทันที แม้ว่าการส่งอีเมลจะยังไม่เสร็จ\n

การทำงานของ Worker (Receiver):

SQL

LISTEN order_channel; -- Worker จะรอรับสัญญาณนี้อย่างต่อเนื่อง\n-- เมื่อได้รับสัญญาณ จะเริ่มกระบวนการที่ใช้เวลานาน เช่น การเรียก API ภายนอก\n

ข้อดี: เพิ่มประสิทธิภาพโดยรวมของระบบ (High Throughput) เพราะระบบหลักไม่ถูกบล็อกด้วยงานที่ใช้เวลานาน

ข้อเสีย: การตรวจสอบสถานะ (Status) ของงานทำได้ยากกว่า และต้องมีการจัดการ Worker Process ภายนอกเพื่อรับประกันว่างานจะถูกประมวลผลอย่างสมบูรณ์

บทสรุป: การเลือกสถาปัตยกรรมที่เหมาะสม

ในฐานะ Senior Architect การตัดสินใจระหว่าง Sync และ Async ควรพิจารณาจากความสำคัญของข้อมูล (Data Criticality) และเวลาที่ผู้ใช้ต้องรอ (Latency) เป็นหลัก:

  • ใช้ Synchronous (Sync) เมื่อ: ข้อมูลต้องมีความสม่ำเสมอในทันที (Immediate Consistency) เช่น การทำธุรกรรมทางการเงิน หรือการอัปเดตสถานะที่สำคัญที่ต้องเห็นผลทันที
  • ใช้ Asynchronous (Async) เมื่อ: งานนั้นเป็นงานรอง (Background Task) ที่ไม่ส่งผลกระทบต่อการใช้งานหลัก เช่น การส่งอีเมล การสร้างรายงานสรุป หรือการประมวลผลรูปภาพขนาดใหญ่

การผสมผสานทั้งสองรูปแบบนี้อย่างชาญฉลาดจะช่วยให้ระบบ PostgreSQL ของคุณมีประสิทธิภาพสูงสุด ทั้งในด้านความถูกต้องของข้อมูลและความเร็วในการตอบสนอง