正确实现暂时性故障处理 (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.asax
的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;
}
然后我使用此方法
using (var conn = GetReliableConnection())
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT COUNT(*) FROM ReliabilityTest";
result = (int) cmd.ExecuteScalarWithRetry();
return View(result);
}
到目前为止,这是有效的。然后,为了测试重试策略,我尝试使用错误的用户名(此处的建议)。
但是当我单步执行该代码时,光标立即跳转到我的catch
语句
用户"[我的用户名]"登录失败。
我本以为此异常仅在几秒钟后捕获,但根本没有发生延迟。
此外,我也尝试了实体框架,正是在这篇文章之后,但得到了相同的结果。
我错过了什么?是否有配置步骤或我错误地诱发了暂时性故障?
暂时性故障处理块用于处理暂时性错误。由于用户名/密码不正确而导致登录失败肯定不是其中之一。从这个网页: 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
。