C# Academy · บทเรียน

การจัดการข้อผิดพลาดและการลองใหม่

จัดการความล้มเหลวด้วยการลองใหม่และคิวจดหมายตาย

บทเรียน 4 จาก 413 ขั้นตอน

การจัดการข้อผิดพลาดและการลองใหม่ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แนวคิดการส่งข้อความ
  2. การผลิตและการใช้ข้อความ
  3. ซากาและเวิร์กโฟลว์
  4. การจัดการข้อผิดพลาดและการลองใหม่
← กลับไปที่ C# Academy