标签: transient-failure

Polly超时政策说明

我正在尝试使timout政策正常运行。集成api时,我有以下要求。

  1. 创建一个http请求以调用Endpoint1并传递transactionID并捕获结果
  2. 如果http请求在20秒内未答复,则发送具有相同transactionID的取消请求并捕获结果

对于此任务,我想使用Polly,在我看来这是一个很棒的组件,可帮助处理瞬态故障。但是,由于我对这项技术还很陌生,所以我只想确定自己是否正确实施。

首先,我像这样用Polly创建了一个超时策略

var timeoutPolicy =
    Policy.TimeoutAsync(
        TimeSpan.FromSeconds( 20 ),
        TimeoutStrategy.Optimistic,
        async ( context, timespan, task ) => {
            //write here the cancel request 
        } );
Run Code Online (Sandbox Code Playgroud)

然后,我准备执行该策略

var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync( async () => {
    //make here the request 1
} );
Run Code Online (Sandbox Code Playgroud)

我从文档中得到的是,如果在timeoutPolicy.ExecuteAndCaptureAsync委托内部发生了超时,则Polly会自动调用onTimeout委托。对?

但是我的问题是:

  • 如果在执行委托内部发生异常会怎样?我应该把该波利结构包装在一个尝试中吗?
  • 当我分析策略结果时,如何理解超时是否发生?

c# polly transient-failure

8
推荐指数
1
解决办法
3861
查看次数

瞬态故障重试逻辑最佳实践

朋友们,我有一个关于围绕 SQL 命令的执行实施简单重试策略的问题。

我的问题是:重试循环应该封装连接和事务的构造,还是应该存在于连接中。

例如:

private void RetryLogSave(DynamicParameters parameters, int retries = 3)
{    
    int tries = 0;

    using (var connection = new SqlConnection(_connectionString))
    {
        connection.Open();

        using (var transaction = connection.BeginTransaction())
        {
            var logItemCommand = new CommandDefinition(commandText: Constants.InsertLogItem,
                parameters: parameters, transaction: transaction, commandType: System.Data.CommandType.Text);

            do
            {
                try
                {
                    tries++;
                    connection.Execute(logItemCommand);
                    transaction.Commit();
                    break;
                }
                catch (Exception exc)
                {
                    if (tries == retries)
                    {
                        transaction.Rollback();
                        throw exc;
                    }
                    Task.Delay(100 * tries).Wait();
                }
            }
            while (true);
        }
}
}
Run Code Online (Sandbox Code Playgroud)

我在这里所做的是否合适且可以接受,或者重试逻辑是否应该存在于 SqlConnection 构造的外部?

c# transient-failure

2
推荐指数
1
解决办法
532
查看次数

标签 统计

c# ×2

transient-failure ×2

polly ×1