Eventual Consistency: เมื่อข้อมูลไม่ตรงกันชั่วคราว เป็นเรื่องปกติของระบบกระจาย

26 มิถุนายน 2569อ่าน 7 นาที
Eventual Consistency: เมื่อข้อมูลไม่ตรงกันชั่วคราว เป็นเรื่องปกติของระบบกระจาย

ทำไมยอดไลก์เพิ่งกดถึงยังไม่ขึ้น หรือยอดเงินโอนแล้วยังไม่อัปเดตทันที คำตอบคือ Eventual Consistency การยอมให้ข้อมูลตรงกันในที่สุด แลกกับความเร็วและความพร้อมใช้งานของระบบขนาดใหญ่

ในระบบเล็กที่มีฐานข้อมูลเดียว ข้อมูลตรงกันเสมอทันที แต่เมื่อระบบโตจนต้องกระจายข้อมูลไปหลายเครื่องหลายที่ การให้ทุกที่ตรงกันทุกเสี้ยววินาที กลับทำให้ระบบช้าและเปราะ Eventual Consistency คือการยอมรับว่าข้อมูลอาจไม่ตรงกันชั่วคราว แต่จะตรงกันในที่สุด เพื่อแลกกับความเร็วและความพร้อมใช้งาน

ทำไมต้องยอมแลก

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

ออกแบบธุรกิจให้รับความไม่ตรงกันชั่วคราวได้

  • แยกว่างานไหนทนความล่าช้าได้ (ยอดไลก์) กับงานที่ต้องตรงทันที (ตัดเงิน)
  • สื่อสารกับผู้ใช้ เช่น แสดงสถานะกำลังดำเนินการ แทนที่จะทำเหมือนเสร็จแล้ว
  • สำหรับเรื่องเงินและสต็อก ใช้กลไกที่รับประกันความถูกต้องเป็นพิเศษ

การเข้าใจ Eventual Consistency ช่วยให้ผู้บริหารและทีมตั้งความคาดหวังให้ถูก ระบบที่ดีไม่ได้แปลว่าทุกอย่างตรงกันทุกเสี้ยววินาที แต่แปลว่ารู้ว่าตรงไหนต้องตรงทันที และตรงไหนรอได้ การเลือกให้เหมาะกับธุรกิจ คือศิลปะของการออกแบบระบบขนาดใหญ่

Eventual ConsistencyDistributed SystemsArchitectureTrade-offs

บริการที่เกี่ยวข้อง

รับพัฒนาเว็บแอปพลิเคชัน

สร้างเว็บแอปที่รองรับการเติบโตและเชื่อมกับระบบอื่นได้

WhaleScope

ดูโครงสร้างตลาดของทุกหมวดธุรกิจไทย บน WhaleScope

รายชื่อบริษัท ผู้เล่นรายใหญ่ และอัตราคงอยู่ของแต่ละหมวด — จากข้อมูลจดทะเบียน 2 ล้านนิติบุคคล

อ่านต่อ

Saga: จัดการธุรกรรมที่ข้ามหลายระบบ เมื่อ ACID ทำไม่ได้

การจองทริปต้องจองตั๋ว โรงแรม และรถพร้อมกัน แต่ทั้งหมดอยู่คนละระบบ ทำเป็นธุรกรรมเดียวไม่ได้ Saga คือรูปแบบที่ทำทีละขั้น และถ้าขั้นใดล้ม ก็ยกเลิกขั้นก่อนหน้าด้วยการชดเชย

Outbox Pattern: แจ้งข่าวระบบอื่นให้ครบทุกครั้ง ไม่มีหลุดหาย

บันทึกออเดอร์สำเร็จแต่ข้อความแจ้งระบบคลังหายไป สต๊อกก็ไม่ถูกตัด ปัญหาเขียนสองที่พร้อมกันนี้เจอบ่อยกว่าที่คิด Outbox Pattern แก้ด้วยการฝากข้อความไว้ในฐานข้อมูลเดียวกัน แล้วค่อยทยอยส่งให้ถึงแน่นอน

Database Sharding: แบ่งฐานข้อมูลเมื่อใหญ่เกินเครื่องเดียว

เมื่อข้อมูลใหญ่จนเครื่องเดียวรับไม่ไหว การเพิ่มเครื่องให้แรงขึ้นมีเพดาน Sharding คือการแบ่งข้อมูลออกไปหลายเครื่อง ช่วยให้ขยายต่อได้ แต่ก็เพิ่มความซับซ้อนที่ต้องแลก

Serverless: จ่ายตามใช้จริง ไม่ต้องดูแลเซิร์ฟเวอร์

Serverless ให้โค้ดทำงานเมื่อมีคนเรียก แล้วจ่ายตามการใช้จริง โดยไม่ต้องดูแลเซิร์ฟเวอร์ เหมาะกับงานที่โหลดไม่สม่ำเสมอ แต่ก็มีข้อจำกัดที่ต้องเข้าใจก่อนเลือกใช้