Comparthing Logo
การจัดคิวข้อความรูปแบบความน่าเชื่อถือระบบกระจายสถาปัตยกรรมคลาวด์การจัดการข้อผิดพลาดโครงสร้างพื้นฐานคลาวด์

คิวจดหมายที่ส่งไม่สำเร็จเทียบกับการลองส่งซ้ำในหน่วยความจำ

คิวข้อความที่ส่งไม่ถึงปลายทาง (Dead Letter Queue หรือ DLQ) และการลองส่งซ้ำในหน่วยความจำ (In-memory retries) เป็นสองแนวทางที่แตกต่างกันโดยพื้นฐานในการจัดการกับความล้มเหลวในการประมวลผลข้อความในระบบแบบกระจาย โดย DLQ ให้การแยกข้อความที่มีปัญหาอย่างถาวร ในขณะที่การลองส่งซ้ำในหน่วยความจำให้การกู้คืนที่เบาและมีความหน่วงต่ำโดยไม่มีค่าใช้จ่ายด้านการคงอยู่ถาวร

ไฮไลต์

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

คิวจดหมายที่ส่งไม่ถึงผู้รับ คืออะไร

คิวข้อความถาวรที่ดักจับข้อความที่ล้มเหลวเพื่อตรวจสอบและประมวลผลใหม่ในภายหลัง

  • ข้อความจะถูกย้ายไปยังคิวรอส่ง (DLQ) หลังจากเกินจำนวนครั้งที่พยายามส่งซ้ำสูงสุด โดยยังคงรักษาเนื้อหาและข้อมูลเมตาของข้อความไว้อย่างครบถ้วน
  • เดิมทีระบบส่งข้อความระดับองค์กรอย่าง IBM MQ และ JMS นิยมใช้ แต่ปัจจุบันเป็นมาตรฐานใน AWS SQS, Azure Service Bus และ RabbitMQ
  • เปิดใช้งานการวิเคราะห์ความล้มเหลวแบบแยกส่วนโดยไม่ปิดกั้นไปป์ไลน์การประมวลผลหลัก ช่วยให้ทีมสามารถแก้ไขปัญหาและเล่นข้อความซ้ำได้
  • โดยทั่วไปจะผสานรวมเข้ากับระบบตรวจสอบและแจ้งเตือนเพื่อแจ้งให้ผู้ปฏิบัติงานทราบเมื่อข้อความเข้าสู่สถานะส่งไม่ถึงปลายทาง
  • รองรับนโยบายการหมดอายุตามเวลา โดย AWS SQS DLQ จะเก็บข้อความไว้ได้นานสูงสุด 14 วันตามค่าเริ่มต้น

การลองใหม่ในหน่วยความจำ คืออะไร

มีการดำเนินการตรรกะการลองใหม่ทันทีภายในกระบวนการเดียวกันโดยไม่ต้องจัดเก็บข้อความภายนอก

  • นโยบายการลองใหม่โดยทั่วไปจะใช้การหน่วงเวลาแบบทวีคูณ โดยเวลาหน่วงจะเพิ่มขึ้นเป็นสองเท่าระหว่างการลองแต่ละครั้ง (เช่น 1 วินาที 2 วินาที 4 วินาที 8 วินาที)
  • เฟรมเวิร์กต่างๆ เช่น Polly (.NET), Resilience4j (Java) และ Retry (Python) มีกลยุทธ์การลองใหม่ที่สามารถกำหนดค่าได้ พร้อมด้วยรูปแบบ Circuit Breaker
  • ไม่ใช้ทรัพยากรโครงสร้างพื้นฐานเพิ่มเติมใดๆ นอกเหนือจากหน่วยความจำและ CPU ที่มีอยู่ของแอปพลิเคชันที่กำลังประมวลผล
  • หากแอปพลิเคชันขัดข้องระหว่างการลองใหม่ การลองใหม่จะล้มเหลวโดยสมบูรณ์ ทำให้สูญเสียสถานะการลองใหม่และอาจรวมถึงบริบทการดำเนินการเดิมด้วย
  • เหมาะที่สุดสำหรับความล้มเหลวชั่วคราว เช่น ปัญหาเครือข่าย การหมดเวลาการเชื่อมต่อฐานข้อมูล และการหยุดชะงักของบริการชั่วคราว

ตารางเปรียบเทียบ

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

การเปรียบเทียบโดยละเอียด

การรับประกันความน่าเชื่อถือและความทนทาน

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

ลักษณะการทำงานและเวลาแฝง

การลองส่งซ้ำในหน่วยความจำนั้นเร็วกว่าอย่างเห็นได้ชัด ไม่มีการส่งข้อมูลผ่านเครือข่าย ไม่มีการเรียกใช้ API ของคิว ไม่มีค่าใช้จ่ายในการแปลงข้อมูล แค่รอสักครู่แล้วลองใหม่อีกครั้ง สำหรับระบบที่มีปริมาณงานสูงที่ประมวลผลข้อความหลายพันข้อความต่อวินาที ความแตกต่างนี้จึงมีความสำคัญมาก DLQ (Delayed Licensing Queue) ทำให้เกิดความหน่วงที่วัดได้ โดยเฉพาะอย่างยิ่งเมื่อข้อความต้องเดินทางผ่านขอบเขตเครือข่ายเพื่อไปยังบริการคิวแยกต่างหาก บางทีมจึงใช้การผสมผสาน โดยใช้การลองส่งซ้ำในหน่วยความจำสำหรับการแก้ไขปัญหาชั่วคราวอย่างรวดเร็ว และใช้ DLQ เป็นตาข่ายนิรภัยสุดท้าย

ความซับซ้อนในการดำเนินงานและการแก้ไขข้อผิดพลาด

DLQ (Dead Letter Queue) สร้างขอบเขตการทำงานที่ชัดเจน วิศวกรที่รับผิดชอบจะได้รับการแจ้งเตือน ตรวจสอบคิวข้อความที่ส่งไม่ถึงปลายทาง แก้ไขข้อผิดพลาดที่เกิดขึ้น และส่งข้อความซ้ำ นี่คือขั้นตอนการทำงานที่เข้าใจได้ง่าย การลองส่งซ้ำในหน่วยความจำจะซ่อนความล้มเหลวไว้ในบันทึกของแอปพลิเคชัน ซึ่งมักต้องใช้การรวบรวมบันทึกและแดชบอร์ดแบบกำหนดเองเพื่อให้ทราบว่ามีการลองส่งซ้ำเกิดขึ้น เมื่อการลองส่งซ้ำหมดลง ความล้มเหลวก็จะกลายเป็นฝันร้ายของตัวแก้ไขความล้มเหลว โดยเฉพาะในไมโครเซอร์วิสที่ความล้มเหลวอาจส่งผลกระทบต่อระบบส่วนอื่น ๆ ก่อนที่ใครจะสังเกตเห็น

การพิจารณาต้นทุนในระดับใหญ่

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

การผสานรวมเข้ากับสถาปัตยกรรมสมัยใหม่

สถาปัตยกรรมแบบขับเคลื่อนด้วยเหตุการณ์และฟังก์ชันไร้เซิร์ฟเวอร์ทำให้ DLQ มีความสำคัญมากขึ้นกว่าเดิม AWS Lambda, Azure Functions และ Google Cloud Functions ต่างรองรับการกำหนดค่า dead letter โดยธรรมชาติ การลองใหม่ในหน่วยความจำนั้นเข้ากับเซิร์ฟเวอร์แอปพลิเคชันแบบดั้งเดิมและกระบวนการที่ใช้เวลานานได้ดีกว่า การเกิดขึ้นของ Kubernetes และการประมวลผลแบบชั่วคราวทำให้กลยุทธ์ในหน่วยความจำซับซ้อนขึ้น คอนเทนเนอร์สามารถถูกยุติได้โดยไม่มีการแจ้งเตือนล่วงหน้า ทำให้ DLQ น่าสนใจมากขึ้นแม้แต่สำหรับทีมที่เคยหลีกเลี่ยงมาก่อน

ข้อดีและข้อเสีย

คิวจดหมายที่ส่งไม่ถึงผู้รับ

ข้อดี

  • + รับประกันความคงทนของข้อความ
  • + การส่งมอบงานที่ชัดเจน
  • + การผสานรวมระบบคลาวด์แบบเนทีฟ
  • + รองรับการเล่นซ้ำและการตรวจสอบ
  • + แยกผลกระทบจากความล้มเหลว

ยืนยัน

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

การลองใหม่ในหน่วยความจำ

ข้อดี

  • + ความหน่วงต่ำมาก
  • + ไม่มีโครงสร้างพื้นฐานเพิ่มเติม
  • + เริ่มแรกใช้งานง่าย
  • + ค่าใช้จ่ายในการดำเนินงานน้อยที่สุด
  • + การให้ผลตอบรับความล้มเหลวอย่างรวดเร็ว

ยืนยัน

  • สูญหายเนื่องจากกระบวนการขัดข้อง
  • ซ่อนจากการปฏิบัติงาน
  • อาจก่อให้เกิดปัญหาการลองใหม่ซ้ำซ้อน
  • การเชื่อมโยงอย่างแน่นหนากับวงจรชีวิตของแอป
  • การแก้ไขข้อผิดพลาดในภายหลังทำได้ยากกว่า

ความเข้าใจผิดทั่วไป

ตำนาน

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

ความเป็นจริง

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

ตำนาน

การลองใหม่ภายในหน่วยความจำนั้นเร็วกว่าเสมอ และด้วยเหตุนี้จึงส่งผลดีต่อประสิทธิภาพการทำงาน

ความเป็นจริง

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

ตำนาน

ข้อความที่อยู่ในคิวข้อความที่ส่งไม่ถึงปลายทางจะได้รับการประมวลผลโดยอัตโนมัติในภายหลัง

ความเป็นจริง

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

ตำนาน

คุณต้องเลือกอย่างใดอย่างหนึ่งระหว่าง DLQ และการลองใหม่ในหน่วยความจำเท่านั้น

ความเป็นจริง

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

ตำนาน

การลองใหม่ในหน่วยความจำนั้นไม่เหมาะสมสำหรับระบบแบบกระจาย

ความเป็นจริง

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

ตำนาน

คิวข้อความที่ส่งไม่ถึงปลายทางช่วยป้องกันการสูญหายของข้อความระหว่างที่ระบบขัดข้อง

ความเป็นจริง

DLQ ช่วยได้เฉพาะข้อความที่ระบบคิวรับไว้แล้วเท่านั้น หากข้อความไม่ถึงคิวหลักเนื่องจากเครือข่ายล่มหรือผู้ผลิตล้มเหลว DLQ ก็ไม่สามารถกู้คืนข้อความนั้นได้โดยอัตโนมัติ ความน่าเชื่อถือแบบครบวงจรต้องอาศัยการคงอยู่ของข้อมูลฝั่งผู้ผลิตด้วยเช่นกัน

คำถามที่พบบ่อย

อะไรคือสาเหตุที่ทำให้ข้อความถูกย้ายไปยังคิวข้อความที่ส่งไม่ถึงผู้รับ?
โดยทั่วไป ข้อความจะเข้าสู่คิวข้อความที่ส่งไม่สำเร็จ (DLQ) หลังจากใช้จำนวนครั้งที่กำหนดในการลองส่งซ้ำจนหมด ซึ่งอาจหมายถึงการเกินจำนวนการรับสูงสุดใน SQS การส่งล้มเหลวไปยังผู้รับหลายราย หรือถูกปฏิเสธโดยโค้ดแอปพลิเคชันโดยตรง ตัวกระตุ้นที่แน่นอนจะแตกต่างกันไปตามแพลตฟอร์ม AWS SQS ใช้การกำหนดนโยบายการส่งซ้ำที่ระบุจำนวนการรับสูงสุด ในขณะที่ Azure Service Bus ติดตามจำนวนการส่ง เมื่อถึงเกณฑ์ดังกล่าว โครงสร้างพื้นฐานการส่งข้อความจะย้ายหรือคัดลอกข้อความไปยังคิวข้อความที่ส่งไม่สำเร็จที่เกี่ยวข้องโดยอัตโนมัติ
การลองใหม่ในหน่วยความจำจัดการกับการเริ่มต้นกระบวนการใหม่หรือข้อผิดพลาดอย่างไร?
แต่ระบบเหล่านั้นทำไม่ได้ ซึ่งเป็นข้อจำกัดพื้นฐานของมัน สถานะการลองใหม่ใดๆ จะมีอยู่เฉพาะในหน่วยความจำของกระบวนการที่กำลังทำงานอยู่เท่านั้น หากแอปพลิเคชันล่ม ถูกปิดระหว่างการปรับใช้ หรือคอนเทนเนอร์ถูกกำหนดเวลาใหม่ การลองใหม่ที่ค้างอยู่ทั้งหมดและบริบทของมันจะหายไป สำหรับการดำเนินการที่ต้องคงอยู่แม้เหตุการณ์ดังกล่าว คุณจำเป็นต้องมีกลไกการลองใหม่แบบถาวร ไม่ว่าจะเป็น DLQ คิวงานที่ใช้ฐานข้อมูล หรือระบบงานแบบกระจาย เช่น Celery หรือ Hangfire
คุณสามารถรวมคิวข้อความที่ส่งไม่สำเร็จ (dead letter queue) กับการลองส่งซ้ำในหน่วยความจำ (in-memory retries) ในระบบเดียวกันได้หรือไม่?
แน่นอน และนี่เป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับหลายทีมด้วยซ้ำ รูปแบบทั่วไปคือการลองใหม่ในหน่วยความจำโดยใช้การหน่วงเวลาแบบทวีคูณสำหรับการกู้คืนชั่วคราวในทันที เช่น การลองสามครั้งในช่วงเวลาไม่กี่วินาที หากการลองเหล่านั้นล้มเหลว ข้อความหรือการดำเนินการจะถูกส่งไปยังคิวที่มีการสนับสนุน DLQ สำหรับการจัดการที่ทนทาน ซึ่งจะให้ความเร็วในการลองใหม่ในหน่วยความจำสำหรับปัญหาเล็กน้อย และความปลอดภัยของ DLQ สำหรับปัญหาที่เกิดขึ้นอย่างต่อเนื่อง
ควรตั้งค่าการตรวจสอบอย่างไรสำหรับคิวจดหมายที่ส่งไม่ถึงผู้รับ?
อย่างน้อยที่สุด ควรตั้งค่าการแจ้งเตือนเกี่ยวกับความลึกของคิว อายุของข้อความที่เก่าที่สุด และอัตราการรับข้อความ การเพิ่มขึ้นอย่างกะทันหันของการรับข้อความใน DLQ มักบ่งชี้ถึงข้อผิดพลาดในการใช้งาน การแจ้งเตือนเกี่ยวกับอายุของข้อความจะช่วยตรวจจับกรณีที่การเล่นซ้ำไม่เกิดขึ้น ทีมหลายทีมยังติดตามอัตราส่วนของข้อความใน DLQ ต่อข้อความที่ประมวลผลสำเร็จเพื่อเป็นตัวบ่งชี้สถานะการทำงาน CloudWatch, Azure Monitor หรือ Datadog สามารถแสดงเมตริกเหล่านี้ได้ด้วยการผสานรวมเพจเจอร์
มีทางเลือกอื่นนอกเหนือจาก DLQ และการลองใหม่ในหน่วยความจำหรือไม่?
รูปแบบต่างๆ มากมายตอบสนองความต้องการที่คล้ายคลึงกัน รูปแบบ Outbox จะจัดเก็บเหตุการณ์แบบธุรกรรมพร้อมกับข้อมูลทางธุรกิจ ทำให้มั่นใจได้ถึงความเป็นอะตอมิก รูปแบบ Saga จัดการธุรกรรมแบบกระจายที่ใช้เวลานานด้วยการดำเนินการชดเชย คิวงานที่ใช้ฐานข้อมูล เช่น Sidekiq หรือ pg-boss ให้การคงอยู่ของข้อมูลโดยไม่ต้องใช้ตัวกลางส่งข้อความโดยเฉพาะ Event sourcing สร้างสถานะขึ้นใหม่จากบันทึกแบบเพิ่มอย่างเดียว ทำให้ความหมายของการลองใหม่แตกต่างออกไป การเลือกที่เหมาะสมขึ้นอยู่กับข้อกำหนดด้านความสม่ำเสมอและโครงสร้างพื้นฐานที่มีอยู่ของคุณ
คุณจะเล่นข้อความจากคิวข้อความที่ส่งไม่ถึงผู้รับได้อย่างปลอดภัยได้อย่างไร?
ห้ามเล่นซ้ำกลับไปยังคิวเดิมโดยตรงโดยไม่ตรวจสอบก่อน เพราะนั่นจะทำให้เกิดลูปไม่สิ้นสุดหากสาเหตุหลักยังคงอยู่ ควรดึงข้อความจาก DLQ ไปยังสภาพแวดล้อมการวิเคราะห์แยกต่างหาก ตรวจสอบตัวอย่างที่แสดงถึงรูปแบบความล้มเหลว แก้ไขปัญหาที่ต้นเหตุ จากนั้นจึงเล่นซ้ำเป็นชุดๆ อย่างเลือกสรรพร้อมกับการตรวจสอบ AWS มีฟีเจอร์การเล่นซ้ำ DLQ และเครื่องมืออย่าง Amazon EventBridge Pipes สามารถช่วยให้เวิร์กโฟลว์การเล่นซ้ำแบบมีเงื่อนไขเป็นไปโดยอัตโนมัติได้
อะไรคือคุณสมบัติของนโยบายการลองใหม่ที่ดีสำหรับการลองใหม่ในหน่วยความจำ?
การหน่วงเวลาแบบทวีคูณพร้อมค่าความคลาดเคลื่อน (jitter) ถือเป็นมาตรฐานที่ดีที่สุด หากไม่มีค่าความคลาดเคลื่อน การลองใหม่พร้อมกันจากไคลเอนต์หลายรายอาจก่อให้เกิดปัญหาการรุมเร้าอย่างรุนแรงต่อบริการที่กำลังกู้คืน ควรจำกัดเวลาหน่วงสูงสุดเพื่อป้องกันการรอคอยที่ไม่มีขอบเขต และควรกำหนดจำนวนครั้งการลองใหม่สูงสุดเสมอ ควรพิจารณาใช้ตัวตัดวงจร (circuit breakers) ที่หยุดการลองใหม่ทั้งหมดเมื่ออัตราความล้มเหลวเกินเกณฑ์ที่กำหนด เพื่อให้บริการปลายทางมีเวลาในการกู้คืนแทนที่จะถูกโจมตีอย่างหนักในขณะที่บริการเหล่านั้นกำลังล่ม
ฟังก์ชันแบบ Serverless ทำงานได้ดีกับการลองใหม่ในหน่วยความจำหรือไม่?
ไม่เชิงครับ ฟังก์ชัน Lambda และฟังก์ชันที่คล้ายกันถูกออกแบบมาให้ไม่มีสถานะและมีอายุสั้น เวลาการทำงานสูงสุดสิบห้านาทีหมายความว่าหน้าต่างการลองใหม่ในหน่วยความจำของคุณมีจำกัด ที่สำคัญกว่านั้น หาก Lambda ล้มเหลว บริบทการทำงานทั้งหมดจะหายไป สถาปัตยกรรมแบบ Serverless สนับสนุนสถานะภายนอกอย่างมาก ทำให้ DLQ หรือฟังก์ชันขั้นตอนที่มีตรรกะการลองใหม่ในตัวเหมาะสมกว่าวิธีการในหน่วยความจำมาก
วิธีการทั้งสองนี้มีข้อกังวลเรื่องการจัดลำดับข้อความที่แตกต่างกันอย่างไร?
DLQ อาจทำให้การรับประกันลำดับซับซ้อนขึ้น หากคิวหลักของคุณเป็นแบบ FIFO การย้ายข้อความเข้าและออกจาก DLQ อาจทำให้ลำดับผิดเพี้ยนไปได้ เว้นแต่แพลตฟอร์มจะรักษาลำดับไว้โดยเฉพาะ การลองใหม่ในหน่วยความจำภายในผู้บริโภครายเดียวจะรักษาลำดับของข้อความของผู้บริโภครายนั้นไว้โดยธรรมชาติ แม้ว่าจะมีผู้บริโภคหลายรายประมวลผลพร้อมกันก็ตาม บางระบบใช้หมายเลขลำดับหรือการจัดลำดับระดับแอปพลิเคชันเพื่อสร้างลำดับที่ถูกต้องขึ้นใหม่หลังจากกลไกการลองใหม่ใดๆ
ข้อควรพิจารณาด้านความปลอดภัยใดบ้างที่เกี่ยวข้องกับคิวจดหมายที่ส่งไม่ถึงผู้รับ?
DLQ (Delayed Licensing Queue) มีข้อมูลสำคัญเช่นเดียวกับคิวหลักของคุณ บางครั้งอาจมีมากกว่าด้วยซ้ำ เนื่องจากมีบริบทของความล้มเหลวรวมอยู่ด้วย ควรใช้การเข้ารหัส การควบคุมการเข้าถึง และการบันทึกการตรวจสอบที่เหมือนกันทุกประการ ควรระมัดระวังเกี่ยวกับกลไกการเล่นซ้ำ การประมวลผลข้อความเก่าซ้ำอาจทำให้เกิดผลข้างเคียงที่ไม่คาดคิดหากระบบปลายทางไม่สามารถทำงานซ้ำได้โดยอัตโนมัติ อุตสาหกรรมบางประเภทที่อยู่ภายใต้การกำกับดูแลกำหนดให้ต้องมีขั้นตอนการอนุมัติที่ชัดเจนก่อนที่จะสามารถเข้าถึงหรือเล่นซ้ำข้อความใน DLQ ได้
เมื่อใดที่คุณควรหลีกเลี่ยงการลองใหม่ในหน่วยความจำโดยสิ้นเชิง?
ควรหลีกเลี่ยงการใช้ฟังก์ชันนี้เมื่อการประมวลผลมีผลข้างเคียงที่ไม่สามารถทำซ้ำได้ เช่น การเรียกเก็บเงินจากบัตรเครดิตสองครั้งเนื่องจากการลองใหม่ ซึ่งเป็นเรื่องร้ายแรง ควรหลีกเลี่ยงการใช้ฟังก์ชันนี้เมื่อความหมายแบบ "ดำเนินการเพียงครั้งเดียว" มีความสำคัญและคุณขาดการกำจัดข้อมูลซ้ำซ้อน อย่าพึ่งพาฟังก์ชันนี้สำหรับการดำเนินการที่ใช้เวลานานซึ่งกระบวนการอาจมีอายุไม่เพียงพอที่จะทำการลองใหม่ให้เสร็จสมบูรณ์ และอย่าใช้ฟังก์ชันนี้เมื่อทีมปฏิบัติการต้องการตรวจสอบรูปแบบความล้มเหลวโดยไม่ต้องปรับใช้การเปลี่ยนแปลงโค้ด
ต้นทุนในระดับองค์กรแตกต่างกันอย่างไร?
โดยทั่วไปแล้ว การตั้งค่า AWS ด้วยคิวมาตรฐาน SQS และ DLQ อาจมีค่าใช้จ่ายไม่กี่ดอลลาร์ต่อข้อความล้านข้อความ บวกกับพื้นที่จัดเก็บสำหรับข้อความที่เก็บไว้ สำหรับระบบที่ประมวลผลหลายพันล้านข้อความต่อเดือน ค่าใช้จ่ายนี้จะมีความสำคัญมาก การลองส่งซ้ำในหน่วยความจำจะเปลี่ยนค่าใช้จ่ายไปที่การประมวลผล ซึ่งคุณจ่ายอยู่แล้ว อย่างไรก็ตาม การลองส่งซ้ำจำนวนมากอาจทำให้ CPU และหน่วยความจำทำงานผิดปกติ ซึ่งอาจต้องใช้ขนาดอินสแตนซ์ที่ใหญ่ขึ้น การวิเคราะห์ต้นทุนรวมส่วนใหญ่สนับสนุนการใช้หน่วยความจำสำหรับงานที่มีความสำคัญต่ำและปริมาณมาก และใช้ DLQ สำหรับเวิร์กโฟลว์ที่สำคัญแต่ปริมาณน้อย

คำตัดสิน

เลือกใช้คิวข้อความที่ส่งไม่ถึงปลายทาง (dead letter queues) เมื่อการสูญหายของข้อความเป็นสิ่งที่ยอมรับไม่ได้ และทีมปฏิบัติการต้องการขอบเขตความล้มเหลวที่ชัดเจนเพื่อการจัดการ เลือกใช้การลองส่งใหม่ในหน่วยความจำ (in-memory retries) เมื่อความเร็วเป็นสิ่งสำคัญที่สุด ความเรียบง่ายของโครงสร้างพื้นฐานเป็นสิ่งที่ควรค่าแก่การให้ความสำคัญ และความล้มเหลวเป็นเพียงชั่วคราว ไม่ใช่ความล้มเหลวของระบบ ระบบที่พัฒนาแล้วหลายระบบมักผสมผสานทั้งสองอย่างเข้าด้วยกัน โดยใช้การลองส่งใหม่ในหน่วยความจำเพื่อการกู้คืนทันที และใช้ DLQ เป็นระบบสำรองขั้นสุดท้าย

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

AWS กับ Google Cloud

การเปรียบเทียบนี้พิจารณา Amazon Web Services และ Google Cloud โดยการวิเคราะห์ข้อเสนอบริการ รูปแบบการกำหนดราคา โครงสร้างพื้นฐานระดับโลก ประสิทธิภาพ ประสบการณ์ของนักพัฒนา และกรณีการใช้งานที่เหมาะสม เพื่อช่วยให้องค์กรเลือกแพลตฟอร์มคลาวด์ที่ตรงกับความต้องการทางเทคนิคและธุรกิจมากที่สุด

Kafka และ Flink เทียบกับการประมวลผลในหน่วยความจำ

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

Operational Intelligence กับ Reactive Incident Response

Operational Intelligence มุ่งเน้นการติดตามผลอย่างต่อเนื่อง การวิเคราะห์เชิงคาดการณ์ และการเพิ่มประสิทธิภาพระบบเชิงรุก ขณะที่ Reactive Incident Response เน้นไปที่การตรวจจับและแก้ไขปัญหาหลังจากที่เกิดขึ้นแล้ว ทั้งสองแนวทางมีบทบาทที่แตกต่างกันแต่เสริมซึ่งกันและกันในการบริหารจัดการโครงสร้างพื้นฐานด้าน IT และคลาวด์สมัยใหม่

Service Mesh สำหรับ Machine Learning เทียบกับ API Gateway แบบดั้งเดิม

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

กลยุทธ์การแคชในระบบแมชชีนเลิร์นนิงเทียบกับการคำนวณตามความต้องการ

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