เชิงเทคนิค · คำตอบพร้อมแหล่งอ้างอิง

Exponential backoff retries คืออะไร

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

กลไกการทำงาน

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

ความสำคัญต่อผู้ส่ง

วิธีนี้ป้องกันไม่ให้ผู้ส่งโจมตีแบบ Denial of Service ต่อเมลเซิร์ฟเวอร์ผู้รับโดยไม่ตั้งใจ หากข้อความนับพันล้มเหลวพร้อมกันและลองใหม่ทุกสิบวินาที ทราฟฟิกที่พุ่งขึ้นอาจทำให้ผู้รับออฟไลน์ต่อไป การกระจายความพยายามลองใหม่ช่วยให้ผู้ส่งรักษาชื่อเสียงได้ดีขึ้น และเพิ่มโอกาสที่ข้อผิดพลาด SMTP 4xx ชั่วคราวจะหายไปก่อนที่ข้อความจะถูกทิ้ง

ข้อพิจารณาในการใช้งานจริง

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

ข้อผิดพลาดที่พบบ่อยในการนำไปใช้

นักพัฒนามักลืมกำหนดขีดจำกัดจำนวนครั้งสูงสุดหรือเพดานของเวลาหน่วง หากไม่มีเพดาน เวลารอเพิ่มไปถึงหลายชั่วโมงหรือหลายวัน ทำให้อีเมล transactional ล่าช้าเกินรับได้ อีกข้อผิดพลาดคือมองความล้มเหลวถาวร 5xx ว่าลองใหม่ได้ ควรใช้ exponential backoff กับข้อผิดพลาดชั่วคราว 4xx เท่านั้น เช่น rate limit หรือ greylisting ชั่วคราว

ตัวอย่างที่เป็นรูปธรรม

สมมติว่าส่งอีเมล transactional ผ่าน API ความพยายามครั้งที่ 1 ล้มเหลวเพราะข้อผิดพลาด 421 server busy ระบบรอ 2 วินาที ครั้งที่ 2 ล้มเหลว ระบบรอ 4 วินาที ครั้งที่ 3 ล้มเหลว ระบบรอ 8 วินาที เมื่อถึงครั้งที่ 4 เซิร์ฟเวอร์ผู้รับน่าจะเคลียร์คิวแล้ว จึงยอมรับอีเมลได้ SendHQ มีเครื่องมือฟรีที่ https://sendhq.cc/tools เพื่อช่วยจัดการประสิทธิภาพของโครงสร้างพื้นฐานอีเมล

คำถามที่ทีมมักถาม

fixed backoff กับ exponential backoff ต่างกันอย่างไร

Fixed backoff ลองใหม่ทุก X วินาทีโดยไม่คำนึงถึงจำนวนครั้งที่ล้มเหลว ส่วน exponential backoff เพิ่มช่วงเวลาหลังล้มเหลวทุกครั้งเพื่อลดภาระของเซิร์ฟเวอร์ปลายทาง

ควรหยุดลองใหม่เมื่อใด

ควรหยุดลองใหม่เมื่อได้รับความล้มเหลวถาวร 5xx ถึงจำนวนครั้งสูงสุดที่กำหนด หรือถึงเพดานของเวลาหน่วงสูงสุด

jitter มีผลต่อการเติบโตแบบเอกซ์โพเนนเชียลหรือไม่

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

แหล่งข้อมูลหลัก