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

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

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

ระบบที่แยกเป็นหลายส่วนมักต้องแจ้งข่าวถึงกัน เช่น เมื่อมีออเดอร์ใหม่ ระบบขายต้องบันทึกออเดอร์ลงฐานข้อมูลของตัวเอง และส่งข้อความบอกระบบคลังให้ตัดสต๊อก ปัญหาคือสองการกระทำนี้เกิดคนละที่ ถ้าบันทึกสำเร็จแต่ส่งข้อความล้มเหลว เช่น ระบบล่มพอดีตรงจังหวะนั้น ออเดอร์ก็จะมีอยู่จริงแต่คลังไม่เคยรู้ สต๊อกไม่ถูกตัด และไม่มีใครเห็นความผิดปกติจนลูกค้าโวย ปัญหานี้เรียกว่า Dual Write คือการพยายามเขียนสองที่ให้สำเร็จพร้อมกัน ซึ่งไม่มีทางรับประกันได้ด้วยการเรียกต่อกันตรง ๆ

ฝากข้อความไว้ที่เดียวกับข้อมูล

Outbox Pattern แก้ปัญหานี้ด้วยความคิดง่าย ๆ คือเปลี่ยนการเขียนสองที่ให้เหลือที่เดียว ตอนบันทึกออเดอร์ ให้เขียนข้อความที่จะแจ้งระบบอื่นลงตารางพิเศษชื่อ Outbox ในฐานข้อมูลเดียวกัน ภายในธุรกรรมเดียวกัน ผลคือออเดอร์กับข้อความจะสำเร็จหรือล้มเหลวไปด้วยกันเสมอ ไม่มีทางที่ออเดอร์มีแต่ข้อความหาย จากนั้นมีตัวส่งที่คอยอ่านตาราง Outbox แล้วทยอยส่งข้อความไปยังระบบปลายทาง ถ้าส่งไม่สำเร็จก็ลองใหม่ได้เรื่อย ๆ เพราะข้อความยังอยู่ในตาราง ข้อแลกคือปลายทางอาจได้รับข้อความซ้ำในบางกรณี จึงต้องออกแบบให้รับซ้ำแล้วผลไม่เพี้ยน ซึ่งเป็นคุณสมบัติที่เรียกว่า Idempotency

  • เขียนข้อมูลและข้อความแจ้งในธุรกรรมเดียวกัน ให้สำเร็จหรือล้มพร้อมกัน
  • มีตัวส่งทยอยอ่านจาก Outbox แล้วส่งซ้ำได้จนกว่าจะถึง
  • ปลายทางต้องรับข้อความซ้ำได้โดยผลไม่เพี้ยน

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

Outbox PatternMessage QueueReliabilityDistributed Systems

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

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

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

WhaleScope

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

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

อ่านต่อ

Dead Letter Queue: จัดการงานที่ทำไม่สำเร็จ ไม่ให้หายเงียบ

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

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

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

Message Queue: ทำไมระบบใหญ่ถึงใช้คิวแทนการเรียกตรง

เมื่อระบบ A เรียกระบบ B ตรง ๆ ถ้า B ล่มหรือช้า A ก็พังตาม Message Queue คั่นกลางด้วยคิวงาน ทำให้ระบบทนทานขึ้น รับโหลดพุ่งได้ และแยกส่วนกันทำงานโดยไม่ล้มพร้อมกัน

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

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