DEV Community

gamer
gamer

Posted on

Idempotence

What & Why

ในระบบปัจจุบัน มันยากที่จะระบบใดๆ จะสามารถการันตีการทำงานแบบ exactly once ได้ ฉะนั้นแล้ว service ใดมีโอกาสที่จะเจอปัญหา duplication request/events เข้ามาในระบบได้เสมอ วิธีการที่ practical กว่า คือที่ฝั่ง consumer ของระบบจะต้องทำให้ operation นั้นมีคุณสมบัติเป็น Idempotent กล่าวคือ เมื่อมี duplicate request/event เกิดขึ้น ระบบจะสามารถจัดการกับปัญหาได้โดยไม่สร้าง duplication record หรือ side effect ที่ไม่พึงประสงค์ในระบบ

วิธีการที่ง่ายที่สุดเพื่อสร้าง Idempotency ให้กับระบบที่ต้องยุ่งกับ database คือพิจารณาว่า เราสามารถทำ upsert กับข้อมูลได้หรือไม่ หรือเราสามารถ ignore ข้อมูลที่ถูกลบไปแล้วได้หรือไม่ เพราะวิธีนี้ เราไม่ต้องจำว่า request ที่เข้ามาใหม่นั้นเคยประมวลผลไปแล้วหรือยัง

แต่ไม่ใช่ทุกครั้งที่เราจะทำ upsert ได้ ฉะนั้นแล้ว อีกเทคนิคหนึ่งที่ช่วยได้ กล่าวคือ ในฝั่ง consumer จะต้องจดจำ message/request id ที่เคยได้รับมา เมื่อมี message/request id ที่ซ้ำเข้ามาอีก ก็อาจจะเลือก ignore ต่อ operation นั้นไปได้เลย

Values & Enablers

  • หลีกเลี่ยงปัญหา การทำ operation ใดซ้ำ เมื่อได้รับ message เดิมเข้ามา

Guidelines

  • พิจารณาใช้เทคนิคนี้เมื่อจำเป็นเท่านั้น เช่นกรณีที่ operation ไม่สามารถทำ upsert ได้ อย่างเช่น การหลีกเลี่ยงการส่ง email ซ้ำๆ เป็นต้น
  • เลือกบันทึกเก็บไว้ในฐานข้อมูล ซึ่งทีมอาจจะพิจารณาใช้ Redis หรือ in-memory database ใดๆ เพื่อให้ได้ประสิทธิภาพสูงสุด
  • ทีมควรพิจารณาตั้งค่า expiry date ให้กับข้อมูล โดยตั้งเวลาให้เหมาะสมกับเรื่องนั้นๆ เพื่อหลีกเลี่ยงปัญหาข้อมูลบวม
  • ให้พิจารณาโอกาสที่ระบบจะถูก replay event ประกอบการตั้งเวลา expiry date ด้วย

Cautions

  • หากตั้ง expiry date เร็วเกินไป ก็จะทำให้เกิด duplicate operation ได้อยู่ดี

References

Top comments (0)