正确实现瞬态故障处理(Azure)

awj*_*awj 4 c# dbconnection azure azure-sql-database

在过去的一天左右,我一直在尝试在Azure SQL数据库上实现瞬态故障处理.虽然我与DB有一个有效的连接,但我不相信它正在按预期处理瞬态故障.

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

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);
                            };
}
Run Code Online (Sandbox Code Playgroud)

我从Global.asax's中调用那个方法Application_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;
}
Run Code Online (Sandbox Code Playgroud)

然后我使用这种方法

using (var conn = GetReliableConnection())
using (var cmd = conn.CreateCommand())
{
    cmd.CommandText = "SELECT COUNT(*) FROM ReliabilityTest";

    result = (int) cmd.ExecuteScalarWithRetry();

    return View(result);
}
Run Code Online (Sandbox Code Playgroud)

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

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

用户'[我的用户名]'登录失败.

我原以为这个例外只会在几秒钟之后被捕获,但根本不会发生延迟.

此外,我也尝试过实体框架,完全按照这篇文章,但得到相同的结果.

我错过了什么?是否有配置步骤或我是否错误地引发了瞬态故障?

Gau*_*tri 11

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

什么是瞬态故障?

当应用程序使用服务时,由于临时条件(如间歇性服务,基础结构级故障,网络问题或服务的显式限制),可能会发生错误; 基于云的服务会更频繁地发生这些类型的错误,但也可能在内部部署解决方案中发生.如果稍后重试操作(可能仅在几毫秒之后),操作可能会成功.这些类型的错误条件称为瞬态故障.瞬态故障通常很少发生,并且在大多数情况下,操作成功只需要几次重试.

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

您始终可以扩展功能并将登录失败作为测试代码的瞬态错误之一.

UPDATE

请查看源代码:http://topaz.codeplex.com/SourceControl/latest#source/Source/TransientFaultHandling.Data/SqlDatabaseTransientErrorDetectionStrategy.cs.这是重试魔法发生的地方.你可以做的是创建一个类(让我们调用它CustomSqlDatabaseTransientErrorDetectionStrategy)并将链接中的整个代码复制到这个类中.然后出于测试目的,您可以将login failed场景添加为瞬态错误之一,并在您的应用程序中使用此类而不是SqlDatabaseTransientErrorDetectionStrategy.

  • 请注意,Microsoft本身一直在不断添加瞬态错误列表。因此,即使在某个时间点,我也不认为这是权威,因为MS的不同团队会做不同的事情。我们坚持了一段时间,但是每当我们以为自己取得了进步时,就会发生一个新的错误,但没有覆盖。因此,我们要做的是对所有错误进行重试,并且将一些严重错误称为“白名单”,不值得重试。 (2认同)