C# Academy · บทเรียน

นโยบายการลองใหม่

ลองใหม่เมื่อเกิดความล้มเหลวชั่วคราวโดยเพิ่มช่วงหน่วง

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

นโยบายการลองใหม่ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

Polly คืออะไร

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

หลักสูตรนี้ใช้ Polly v8 ซึ่งเป็น API ของ Polly.Core

dotnet add package Polly.Core

เหตุใดจึงต้องลองใหม่

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

ควรใช้การลองใหม่กับข้อผิดพลาดชั่วคราวเท่านั้น และไม่ควรใช้กับข้อผิดพลาดถาวร เช่น 404

กลยุทธ์การลองใหม่พื้นฐาน

ใน Polly v8 คุณสร้าง ResiliencePipeline ด้วย RetryStrategyOptions โดยค่าเริ่มต้น ข้อยกเว้นที่ถูกส่งออกมาจะเป็นเหตุให้ลองใหม่

using Polly;
using Polly.Retry;

var pipeline = new ResiliencePipelineBuilder()
    .AddRetry(new RetryStrategyOptions
    {
        MaxRetryAttempts = 3
    })
    .Build();

ดำเนินการผ่าน pipeline

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

await pipeline.ExecuteAsync(async token =>
{
    await httpClient.GetAsync("https://api.example.com/data", token);
});

ตัดสินใจว่าจะลองใหม่กับสิ่งใด

ใช้ ShouldHandle ร่วมกับตัวสร้างเงื่อนไข เพื่อให้ลองใหม่เฉพาะข้อยกเว้นหรือผลลัพธ์ที่ระบุ และหลีกเลี่ยงการลองใหม่เมื่อเกิดข้อผิดพลาดถาวร

new RetryStrategyOptions<HttpResponseMessage>
{
    ShouldHandle = new PredicateBuilder<HttpResponseMessage>()
        .Handle<HttpRequestException>()
        .HandleResult(r => r.StatusCode == HttpStatusCode.ServiceUnavailable),
    MaxRetryAttempts = 3
};

การหน่วงเวลาแบบคงที่หรือแบบทวีคูณ

การลองใหม่ทันทีอาจเพิ่มภาระให้บริการที่กำลังมีปัญหา การหน่วงเวลาจะแบ่งช่วงห่างระหว่างการลองแต่ละครั้ง Polly รองรับการหน่วงเวลาแบบคงที่ แบบเชิงเส้น และแบบทวีคูณผ่านการตั้งค่า BackoffType

การหน่วงเวลาแบบทวีคูณ

การหน่วงเวลาแบบทวีคูณจะเพิ่มเวลาหน่วงเป็นสองเท่าในแต่ละครั้งที่ลองใหม่ เช่น 2 วินาที, 4 วินาที, 8 วินาที ตั้งค่า BackoffType.Exponential พร้อมกับค่า Delay พื้นฐาน

new RetryStrategyOptions
{
    MaxRetryAttempts = 4,
    BackoffType = DelayBackoffType.Exponential,
    Delay = TimeSpan.FromSeconds(2)
};

เพิ่มความสุ่มให้เวลาหน่วง

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

new RetryStrategyOptions
{
    MaxRetryAttempts = 4,
    BackoffType = DelayBackoffType.Exponential,
    Delay = TimeSpan.FromSeconds(1),
    UseJitter = true
};

ตอบสนองเมื่อมีการลองใหม่แต่ละครั้ง

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

new RetryStrategyOptions
{
    MaxRetryAttempts = 3,
    OnRetry = args =>
    {
        Console.WriteLine($"Retry {args.AttemptNumber} after {args.RetryDelay}");
        return default;
    }
};

จำกัดเวลารวมของการลองใหม่

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

การลองใหม่สำหรับ HttpClient

สำหรับการเรียก HTTP ให้ลงทะเบียนตัวจัดการด้านความทนทานต่อความล้มเหลวกับ HttpClient เพื่อให้การลองใหม่มีผลกับทุกคำขอโดยอัตโนมัติ

builder.Services.AddHttpClient("api")
    .AddResilienceHandler("retry", pipeline =>
    {
        pipeline.AddRetry(new HttpRetryStrategyOptions
        {
            MaxRetryAttempts = 3,
            BackoffType = DelayBackoffType.Exponential
        });
    });

ตรวจสอบอย่างรวดเร็ว

ทดสอบความรู้เกี่ยวกับการลองใหม่

สรุป

นโยบายการลองใหม่ช่วยจัดการความล้มเหลวชั่วคราวด้วยการดำเนินการซ้ำ ใน Polly v8 คุณสร้าง pipeline ด้วย AddRetry กำหนดขอบเขตด้วย ShouldHandle และเว้นช่วงระหว่างการลองแต่ละครั้งด้วย BackoffType.Exponential ร่วมกับ UseJitter ใช้ OnRetry เพื่อติดตามการลองแต่ละครั้ง และลงทะเบียนตัวจัดการด้านความทนทานต่อความล้มเหลวเพื่อปกป้องการเรียก HttpClient ทุกครั้ง

เริ่มต้นได้ฟรี

เรียนรู้ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “นโยบายการลองใหม่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. นโยบายการลองใหม่
  2. รูปแบบตัวตัดวงจร
  3. นโยบายหมดเวลาและค่าทดแทน
  4. ไปป์ไลน์ความทนทาน
← กลับไปที่ C# Academy