在 asp.net 核心中实施重试策略

本文关键字:重试 策略 施重试 asp net 核心 | 更新日期: 2023-09-27 17:56:20

在核心中实现重试策略的最简单方法是什么 asp.net?这个想法很简单,如果引发某种特定类型的异常(比如 sql 死锁 ),我们最多重试 httprequest N 次。

我使用中间件

进行 som 自定义身份验证,我不知道中间件是否是这种机制的最佳选择(我是管道架构的新手,我读过有几种类型的组件:单例、每个请求等......

更新:这里给出的 Sql 死锁只是举个例子,我的应用程序只有 restful Web 服务,每个请求都很短,完全在可序列化的 Sql 事务中运行(没有其他副作用,我无法回滚,如发送电子邮件或删除文件......因为我使用的是事务,并且因为我不能保证我的事务将始终以相同的顺序使用表(这取决于谁调用 Web 服务),死锁是不可避免的,所以我需要对所有 httprequest 有一个重试策略。(问题不在于事务和死锁,而在于如何在核心 asp.net 实现重试警察)

在 asp.net 核心中实施重试策略

您可以使用开箱即用的工具,例如 Polly。

Polly 是一个 .NET 3.5/4.0/4.5/PCL 库,允许开发人员以流畅的方式表达暂时性异常和故障处理策略,例如重试、永久重试、等待和重试或断路器。

在您的特定情况下,示例可能是:

Policy
  .Handle<SqlException>(ex => ex.Number == 1205) // sql deadlock
  .Retry(3, (exception, retryCount) =>
  {
     // do something 
  });

虽然我不确定您的 sql 死锁和 Web 请求如何相互关联。我认为您会重试 http 请求以响应 http 状态代码。例如,以下策略,然后添加如何处理这些条件:

Policy
  .HandleResult<HttpStatusCode>(HttpStatusCode.InternalServerError)
  .OrResult<HttpStatusCode>(HttpStatusCode.BadGateway)
很大

程度上取决于您要重试的级别。假设数据库操作失败。是要重试整个请求(及其所有开销)还是仅重试该操作?

根据您希望重试的级别,您可能会找到一个或另一个更合适的解决方案。

始终可以通过重新调用管道中遵循该中间件的组件在中间件级别重试,但要记住的非常重要的是,您不能盲目重试(我不敢这样做),因为代码无法为此而设计......

就像卢克·赫顿(Luke Hutton)建议的那样,波莉可能是你可以使用的东西。