การจัดการข้อผิดพลาดและการลองใหม่
จัดการความล้มเหลวด้วยการลองใหม่และคิวจดหมายตาย
การจัดการข้อผิดพลาดและการลองใหม่ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
ความล้มเหลวเป็นเรื่องปกติ
ตัวรับข้อความอาจล้มเหลวได้จากข้อผิดพลาดของฐานข้อมูลชั่วคราว ระยะหมดเวลาของระบบปลายทาง หรือข้อบกพร่องจากข้อมูลที่ไม่ถูกต้อง MassTransit มีเครื่องมือจัดการหลายชั้น ได้แก่ การลองใหม่ การส่งมอบซ้ำ และคิวข้อผิดพลาด เพื่อให้จัดการความล้มเหลวได้อย่างราบรื่นแทนที่จะทำข้อความสูญหาย
การลองใหม่ทันที
สำหรับปัญหาสะดุดชั่วครู่ ให้กำหนดค่าการลองใหม่เพื่อให้ MassTransit ประมวลผลข้อความอีกสองสามครั้งติดต่อกันอย่างรวดเร็วก่อนจะยอมแพ้
cfg.ReceiveEndpoint("orders", e =>
{
e.UseMessageRetry(r => r.Immediate(3));
e.ConfigureConsumer<OrderConsumer>(context);
});การลองใหม่ตามช่วงเวลาและแบบทวีคูณ
การเว้นช่วงระหว่างการลองใหม่จะช่วยเมื่อการกู้คืนใช้เวลานานขึ้น ใช้ช่วงเวลาหรือการหน่วงแบบทวีคูณ ซึ่งมีลักษณะคล้ายกับพอลลี
e.UseMessageRetry(r =>
r.Exponential(5,
minInterval: TimeSpan.FromSeconds(1),
maxInterval: TimeSpan.FromMinutes(1),
intervalDelta: TimeSpan.FromSeconds(2)));การกรองข้อผิดพลาดที่จะลองใหม่
ลองใหม่เฉพาะข้อยกเว้นชั่วคราว อย่าลองใหม่เมื่อเป็นข้อยกเว้นถาวร เช่น ความล้มเหลวในการตรวจสอบความถูกต้อง ใช้ Handle และ Ignore เพื่อกำหนดขอบเขตของการลองใหม่
e.UseMessageRetry(r =>
{
r.Handle<TimeoutException>();
r.Ignore<ValidationException>();
r.Immediate(3);
});การลองใหม่เทียบกับการส่งมอบซ้ำ
การลองใหม่จะเก็บข้อความไว้ในหน่วยความจำและประมวลผลซ้ำอย่างรวดเร็ว ส่วนการส่งมอบซ้ำ (การลองใหม่แบบหน่วงเวลา/ระดับที่สอง) จะส่งข้อความกลับไปยังตัวกลางข้อความเพื่อส่งมอบอีกครั้งในเวลาที่ช้ากว่ามาก ทำให้ตัวรับข้อความว่างในระหว่างนั้น
e.UseDelayedRedelivery(r =>
r.Intervals(TimeSpan.FromMinutes(5),
TimeSpan.FromMinutes(15),
TimeSpan.FromMinutes(30)));การรวมการจัดการทั้งสองชั้น
การตั้งค่าที่มีความทนทานจะใช้การลองใหม่ทันทีสำหรับปัญหาสะดุดชั่วครู่ และใช้การส่งมอบซ้ำแบบหน่วงเวลาสำหรับระบบขัดข้องเป็นเวลานาน กำหนดค่าการส่งมอบซ้ำไว้นอกการลองใหม่ เพื่อให้การส่งมอบซ้ำแต่ละครั้งได้รับการลองใหม่ทันทีของตนเองด้วย
e.UseDelayedRedelivery(r => r.Intervals(
TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15)));
e.UseMessageRetry(r => r.Immediate(3));คิวข้อผิดพลาด
เมื่อการลองใหม่และการส่งมอบซ้ำทั้งหมดหมดลง MassTransit จะย้ายข้อความไปยังคิวข้อผิดพลาด (ชื่อ <queue>_error) ข้อความจะถูกเก็บไว้พร้อมรายละเอียดข้อยกเว้นเพื่อใช้ตรวจสอบ และจะไม่ถูกทิ้งอย่างเงียบ ๆ
ความขัดข้อง
เมื่อเกิดความล้มเหลว MassTransit จะเผยแพร่เหตุการณ์ Fault<T> ด้วย บริการอื่นสามารถรับความขัดข้องเพื่อแจ้งเตือน บันทึกข้อมูล หรือเรียกใช้การชดเชย
public class OrderFaultConsumer : IConsumer<Fault<OrderPlaced>>
{
public Task Consume(ConsumeContext<Fault<OrderPlaced>> context)
{
// inspect context.Message.Exceptions
return Task.CompletedTask;
}
}ความสามารถในการทำซ้ำโดยไม่เกิดผลซ้ำสำคัญ
เนื่องจากการลองใหม่และการส่งมอบซ้ำอาจทำให้ประมวลผลข้อความมากกว่าหนึ่งครั้ง ตัวรับข้อความจึงต้องทำงานซ้ำโดยไม่เกิดผลซ้ำซ้อน กล่าวคือ การจัดการข้อความเดิมสองครั้งต้องไม่เรียกเก็บเงินซ้ำหรือทำงานซ้ำ ใช้รหัสที่ไม่ซ้ำกันและการตรวจสอบเพื่อป้องกันข้อมูลซ้ำ
การเล่นข้อความซ้ำจากคิวข้อผิดพลาด
หลังจากแก้ไขข้อบกพร่องแล้ว คุณสามารถย้ายข้อความจากคิวข้อผิดพลาดกลับไปยังคิวเดิมเพื่อประมวลผลใหม่ และกู้คืนงานที่เคยล้มเหลวได้
คิวข้อความตกค้างและคิวที่ข้าม
MassTransit ยังใช้คิวที่ข้าม (_skipped) สำหรับข้อความที่ไม่มีตัวรับข้อความใดต้องการ ช่วยให้คุณสังเกตเห็นชนิดข้อความที่กำหนดเส้นทางผิดหรือไม่คาดคิดในระบบจริง
ตรวจสอบอย่างรวดเร็ว
ทดสอบการจัดการข้อผิดพลาดและการลองใหม่
สรุป
MassTransit จัดการความล้มเหลวเป็นชั้น ๆ ได้แก่ การลองใหม่ (ทันที/แบบทวีคูณ โดยกำหนดขอบเขตด้วยการจัดการ/ละเว้น) สำหรับปัญหาสะดุดชั่วครู่ การส่งมอบซ้ำสำหรับระบบขัดข้องเป็นเวลานาน และคิวข้อผิดพลาดสำหรับข้อความที่ลองใหม่จนหมด รวมถึงเหตุการณ์ Fault<T> สำหรับการแจ้งเตือน เนื่องจากข้อความอาจถูกประมวลผลมากกว่าหนึ่งครั้ง ตัวรับข้อความจึงควรทำงานซ้ำโดยไม่เกิดผลซ้ำซ้อน และสามารถเล่นข้อความซ้ำจากคิวข้อผิดพลาดหลังแก้ไขข้อบกพร่องแล้ว
เรียนรู้ C# ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 93
- บทเรียน
- 346
คำถามที่พบบ่อย
บทเรียน “การจัดการข้อผิดพลาดและการลองใหม่” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการข้อผิดพลาดและการลองใหม่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดและการลองใหม่”
จัดการความล้มเหลวด้วยการลองใหม่และคิวจดหมายตาย คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการข้อผิดพลาดและการลองใหม่” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แนวคิดการส่งข้อความ
- การผลิตและการใช้ข้อความ
- ซากาและเวิร์กโฟลว์
- การจัดการข้อผิดพลาดและการลองใหม่