Idempotency และ Retry: ออกแบบระบบที่ทำงานซ้ำได้โดยไม่พัง

28 มิถุนายน 2569อ่าน 7 นาที
Idempotency และ Retry: ออกแบบระบบที่ทำงานซ้ำได้โดยไม่พัง

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

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

ทำไม Retry ถึงจำเป็น และทำไมมันอันตรายถ้าไม่มี Idempotency

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

วิธีทำให้ระบบ idempotent ในทางปฏิบัติ

  • ให้ทุกคำขอมี idempotency key เฉพาะตัว แล้วฝั่งเซิร์ฟเวอร์จำว่าคีย์นี้ทำไปแล้ว
  • ออกแบบฐานข้อมูลให้มีข้อจำกัดกันข้อมูลซ้ำ (unique constraint) ตรงจุดสำคัญ
  • แยกการกระทำที่ทำซ้ำได้ปลอดภัย (อ่าน, ตั้งค่า) จากที่ต้องระวัง (เพิ่มยอด, ส่งเงิน)

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

IdempotencyReliabilityAPISoftware Engineering

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

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

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

WhaleScope

ดูโครงสร้างตลาดของธุรกิจซอฟต์แวร์ สื่อ และไอที บน WhaleScope

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

อ่านต่อ

Race Condition: เมื่อสองงานชนกัน แล้วข้อมูลเพี้ยน

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

N+1 Query: ปัญหายอดฮิตที่ทำให้ระบบช้าโดยไม่รู้ตัว

หน้าจอที่แสดงรายการ 100 รายการ อาจยิงคำขอไปฐานข้อมูลถึง 101 ครั้งโดยไม่จำเป็น นี่คือปัญหา N+1 Query ที่พบบ่อยมาก ฟังดูเล็กแต่ทำให้ระบบช้าลงหลายเท่า

API Versioning: เปลี่ยน API โดยไม่ทำระบบที่เชื่อมต่อพัง

เมื่อหลายระบบและพาร์ตเนอร์เชื่อมต่อผ่าน API ของคุณ การแก้ API หนึ่งจุดอาจทำให้ของคนอื่นพังหมด API Versioning คือวิธีเปลี่ยนแปลงอย่างปลอดภัย โดยไม่ทิ้งคนที่ยังใช้ของเก่า

GraphQL หรือ REST: เลือก API แบบไหนให้เหมาะกับงาน

REST เป็นมาตรฐานที่เรียบง่ายและใช้กันทั่วไป ส่วน GraphQL ให้ผู้เรียกขอข้อมูลได้ตรงตามต้องการ ลดการดึงเกินหรือขาด เข้าใจข้อดีข้อเสียเพื่อเลือกให้เหมาะ ไม่ใช่เลือกตามกระแส