C#混沌工程:通过破坏应用来拯救业务

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么您的C#服务并非完美机制



想象一下:您编写了一个优雅的C#微服务。代码通过了代码审查,单元测试覆盖率达到95%,集成测试全部通过。您将其部署到生产环境,然后……3小时后系统崩溃了。原因是什么?意外的流量激增导致线程池过载,或者您未预料到的数据库突然断开连接。



欢迎来到现实世界,在这里混沌工程不再是奢侈品,而是必需品。这不是为了“取乐而破坏一切”。这是一门学科,帮助您在用户发现问题之前,找出分布式系统中的薄弱环节。



在本文中,我们将探讨如何将混沌工程应用于C#应用程序:从理论到使用Polly和Simmy库的实际代码示例。您将学习如何有意地在.NET服务中引入混沌,以提高其稳定性和可预测性。



什么是混沌工程,为什么它对.NET很重要?



混沌工程是一种对分布式系统进行实验的实践,以检验其承受意外故障的能力。Netflix、亚马逊、微软——所有巨头都在使用它。对于C#开发者来说,这尤其重要,因为.NET Core/5+越来越多地用于在Microsoft Azure上构建高负载的云服务。



混沌工程的主要原则:

  • 定义“稳态”——您的系统在正常情况下如何运行(延迟、吞吐量、错误率)。
  • 提出假设——“如果OrderDB数据库宕机,订单服务将继续使用缓存数据响应5分钟。”
  • 引入混沌——您实际关闭OrderDB 30秒。
  • 验证假设——查看指标。如果假设不成立,那么您的架构中存在缺陷。


这里的关键词是“实验”。您不仅仅是希望一切顺利,而是证明您的系统能够存活下来。



C#混沌工程的工具集



在.NET世界中,有两个强大的工具可以协同工作:

  • Polly——用于实现容错模式(重试、断路器、超时、舱壁隔离)的库。
  • Simmy (Microsoft.Extensions.Resilience)——用于混沌工程的库,扩展了Polly。允许您向策略中“注入”故障。


Simmy是Polly的“邪恶兄弟”。如果说Polly教会您的应用程序生存,那么Simmy则通过有意破坏调用来检验它做得有多好。



实践:在C#中配置混沌实验



让我们进入代码部分。假设我们有一个预订服务,它调用外部支付API。我们想测试如果支付API开始响应延迟或返回错误,BookingService会如何表现。



步骤1:安装包

dotnet add package Microsoft.Extensions.Http.Pollydotnet add package Microsoft.Extensions.Resilience


步骤2:使用策略配置HttpClient

首先,我们使用Polly配置标准的断路器和重试策略。然后,我们使用Simmy将其“包装”在混沌策略中。



using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Http.Resilience;using Polly;using Polly.Extensions.Http;

public static class ServiceCollectionExtensions{ public static IServiceCollection AddPaymentClient(this IServiceCollection services) { services.AddHttpClient<IPaymentService, PaymentService>(client =&g

博客

书籍推荐