正确实现暂时性故障处理 (Azure)

本文关键字:Azure 故障处理 暂时性 实现 | 更新日期: 2023-09-27 18:36:36

在过去的一天左右的时间里,我一直在尝试在Azure SQL数据库上实现暂时性故障处理。尽管我与数据库建立了有效的连接,但我不相信它正在按预期处理暂时性故障。

到目前为止,我的方法涉及

public static void SetRetryStratPol()
{
    const string defaultRetryStrategyName = "default";
    var strategy = new Incremental(defaultRetryStrategyName, 3, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
    var strategies = new List<RetryStrategy> { strategy };
    var manager = new RetryManager(strategies, defaultRetryStrategyName);
    RetryManager.SetDefault(manager);
    retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(strategy);
    retryPolicy.Retrying += (obj, eventArgs) =>
                            {
                                var msg = String.Format("Retrying, CurrentRetryCount = {0} , Delay = {1}, Exception = {2}", eventArgs.CurrentRetryCount, eventArgs.Delay, eventArgs.LastException.Message);
                                System.Diagnostics.Debug.WriteLine(msg);
                            };
}

我从Global.asaxApplication_Start()中调用该方法。[ retryPolicy 是静态类上的全局静态变量,其中也包括下一个方法。

然后我有一个方法

public static ReliableSqlConnection GetReliableConnection()
{
    var conn = new ReliableSqlConnection("Server=...,1433;Database=...;User ID=...;Password=...;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;", retryPolicy);
    conn.Open();
    return conn;
}

然后我使用此方法

using (var conn = GetReliableConnection())
using (var cmd = conn.CreateCommand())
{
    cmd.CommandText = "SELECT COUNT(*) FROM ReliabilityTest";
    result = (int) cmd.ExecuteScalarWithRetry();
    return View(result);
}

到目前为止,这是有效的。然后,为了测试重试策略,我尝试使用错误的用户名(此处的建议)。

但是当我单步执行该代码时,光标立即跳转到我的catch语句

用户"[我的用户名]"登录失败。

我本以为此异常仅在几秒钟后捕获,但根本没有发生延迟。

此外,我也尝试了实体框架,正是在这篇文章之后,但得到了相同的结果。

我错过了什么?是否有配置步骤或我错误地诱发了暂时性故障?

正确实现暂时性故障处理 (Azure)

暂时性故障处理块用于处理暂时性错误。由于用户名/密码不正确而导致登录失败肯定不是其中之一。从这个网页: http://msdn.microsoft.com/en-us/library/dn440719%28v=pandp.60%29.aspx:

什么是瞬态故障?

当应用程序使用服务时,由于以下原因,可能会发生错误: 间歇性服务等临时条件, 基础结构级故障、网络问题或显式限制 服务;这些类型的错误更频繁地发生 基于云的服务,但也可能发生在本地解决方案中。如果 您稍后重试该操作(可能只有几个 毫秒后)操作可能会成功。这些类型的错误 条件称为暂时性故障。暂时性故障 通常很少发生,在大多数情况下,只有少数 重试是操作成功的必要条件。

您可能需要检查此应用程序块 (http://topaz.codeplex.com/) 的源代码,并查看从 SQL 数据库返回的错误代码被视为暂时性错误,因此会重试。

您始终可以扩展该功能,并将失败的登录作为暂时性错误之一来测试您的代码。

更新

请看一下这里的源代码:http://topaz.codeplex.com/SourceControl/latest#source/Source/TransientFaultHandling.Data/SqlDatabaseTransientErrorDetectionStrategy.cs。这就是重试魔术发生的地方。你可以做的是创建一个类(我们称之为CustomSqlDatabaseTransientErrorDetectionStrategy),并将整个代码从链接复制到这个类)。然后,出于测试目的,您可以将login failed方案添加为暂时性错误之一,并在应用程序中使用此类而不是 SqlDatabaseTransientErrorDetectionStrategy