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

กู้คืนตามลำดับที่แน่นอน เก็บข้อความไว้ ค้นหาผลลัพธ์ และหลังจากนั้นจึงตัดสินว่าการส่งครั้งที่สองได้รับอนุญาตหรือไม่

เริ่มจากข้อความและตราเวลา

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

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

ค้นหาผลลัพธ์ในมุมมองของแอปเอง

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

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

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

ตัดสินว่าการส่งครั้งที่สองปลอดภัยหรือไม่

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

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

curl -i -X POST https://api.example.net/v1/orders \
  -H "Idempotency-Key: 6f1c2a94-3b7e-4a10-9c22-5d0e8f7b1a63" \
  -H "Content-Type: application/json" \
  --data @order.json

คีย์ช่วยได้ก็ต่อเมื่อบริการเก็บคีย์นั้นไว้กับการดำเนินการและคืนผลลัพธ์เดิมเมื่อทำซ้ำ ทดสอบพฤติกรรมนั้นที่ปลายทางทดสอบก่อนจะพึ่งพาในการใช้งานจริง

เก็บหลักฐานก่อนกดอะไรอีกครั้ง

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

ถามเจ้าของบริการหนึ่งคำถามที่เจาะจง การดำเนินการด้วยเนื้อหานี้ในเวลานี้สำเร็จหรือไม่ และมีการอ้างอิงสำหรับมันหรือไม่ คำถามนั้นมีคำตอบ ขณะที่ "เว็บไซต์เสียหรือไม่" ไม่มี

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

บทความที่เกี่ยวข้อง