Idempotency และ retry
ความน่าเชื่อถือใช้ identity สองชั้นซึ่งห้ามสับสนกัน
Idempotency-Keyระบุ submission เดิมที่ payload ต้องเหมือนเดิมทุก byte เชิง canonicalexternal_refระบุ business row เดิม แม้ส่งภายใต้ transport key ใหม่
เมื่อผลลัพธ์ไม่แน่ชัด
ถ้า connection หลุดหลัง CFO อาจรับ request แล้ว ให้โหลด canonical payload และ Idempotency-Key
เดิมจาก durable outbox แล้วส่งซ้ำ ระบบต้องคืน job เดิมและไม่สร้าง business row เพิ่ม ห้ามสร้าง key ใหม่
เพียงเพราะไม่ได้รับ response
กรณ ีทดสอบบังคับ
- same-key replay: key เดิม + payload เดิม → job เดิม
- changed payload: key เดิม + payloadต่าง →
IDEMPOTENCY_KEY_REUSEDและต้องหยุด - business duplicate: key ใหม่ +
external_refเดิม →skipped_duplicate - new business: key ใหม่ +
external_refใหม่ → สร้างหนึ่ง row - ERP restart: identity/hash ต้องอยู่ครบและ retry แล้วไม่ซ้ำ
429 และ retryable 5xx ต้องใช้ bounded backoff เมื่อมี Retry-After ให้รอตามค่านั้น การ retry ทุกครั้งต้อง
ใช้ request ที่ freeze ไว้ ไม่ re-read ข้อมูล ERP จน payload เปลี่ยนกลางทาง