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