gpt4 book ai didi

c#-4.0 - tableclient.RetryPolicy 对比 transient 故障处理

转载 作者:行者123 更新时间:2023-12-02 19:45:35 25 4
gpt4 key购买 nike

我和一位同事的任务是寻找 Azure 表存储的连接重试逻辑。经过一番搜索,我发现了这个非常酷的企业库套件,其中包含 Microsoft.Practices.TransientFaultHandling命名空间。

按照几个代码示例,我最终创建了一个 Incremental重试策略,并使用 retryPolicy 包装我们的存储调用之一的ExecuteAction回调处理程序:

/// <inheritdoc />
public void SaveSetting(int userId, string bookId, string settingId, string itemId, JObject value)
{
// Define your retry strategy: retry 5 times, starting 1 second apart, adding 2 seconds to the interval each retry.
var retryStrategy = new Incremental(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));

var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting(StorageConnectionStringName));

try
{
retryPolicy.ExecuteAction(() =>
{
var tableClient = storageAccount.CreateCloudTableClient();

var table = tableClient.GetTableReference(SettingsTableName);

table.CreateIfNotExists();

var entity = new Models.Azure.Setting
{
PartitionKey = GetPartitionKey(userId, bookId),
RowKey = GetRowKey(settingId, itemId),
UserId = userId,
BookId = bookId.ToLowerInvariant(),
SettingId = settingId.ToLowerInvariant(),
ItemId = itemId.ToLowerInvariant(),
Value = value.ToString(Formatting.None)
};

table.Execute(TableOperation.InsertOrReplace(entity));
});
}
catch (StorageException exception)
{
ExceptionHelpers.CheckForPropertyValueTooLargeMessage(exception);

throw;
}
}
}

感觉棒极了,我去给我的同事看,他得意地指出我们可以做同样的事情,而不必包含企业库,如CloudTableClient对象已经有一个重试策略的 setter 。他的代码最终看起来像:

/// <inheritdoc />
public void SaveSetting(int userId, string bookId, string settingId, string itemId, JObject value)
{
var storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting(StorageConnectionStringName));
var tableClient = storageAccount.CreateCloudTableClient();

// set retry for the connection
tableClient.RetryPolicy = new ExponentialRetry(TimeSpan.FromSeconds(2), 3);

var table = tableClient.GetTableReference(SettingsTableName);

table.CreateIfNotExists();

var entity = new Models.Azure.Setting
{
PartitionKey = GetPartitionKey(userId, bookId),
RowKey = GetRowKey(settingId, itemId),
UserId = userId,
BookId = bookId.ToLowerInvariant(),
SettingId = settingId.ToLowerInvariant(),
ItemId = itemId.ToLowerInvariant(),
Value = value.ToString(Formatting.None)
};

try
{
table.Execute(TableOperation.InsertOrReplace(entity));
}
catch (StorageException exception)
{
ExceptionHelpers.CheckForPropertyValueTooLargeMessage(exception);

throw;
}
}

我的问题:

除了实现之外,这两种方法之间还有什么重大区别吗?它们似乎都实现了相同的目标,但是否存在使用其中一种更好的情况?

最佳答案

从功能上来说,两者是相同的 - 它们都会在出现暂时性错误时重试请求。不过,还是有一些区别:

  • 存储客户端库中的重试策略处理仅处理存储操作的重试,而 transient 故障处理重试不仅处理存储操作,还会在发生 transient 错误时重试 SQL Azure、服务总线和缓存操作。因此,如果您的项目使用了更多存储空间,但只想采用一种方法来处理 transient 错误,那么您可能需要使用 transient 故障处理应用程序 block 。
  • 我喜欢 transient 故障处理 block 的一件事是,您可以拦截重试操作,这是重试策略无法做到的。例如,看下面的代码:

        var retryManager = EnterpriseLibraryContainer.Current.GetInstance<RetryManager>();
    var retryPolicy = retryManager.GetRetryPolicy<StorageTransientErrorDetectionStrategy>(ConfigurationHelper.ReadFromServiceConfigFile(Constants.DefaultRetryStrategyForTableStorageOperationsKey));
    retryPolicy.Retrying += (sender, args) =>
    {
    // Log details of the retry.
    var message = string.Format(CultureInfo.InvariantCulture, TableOperationRetryTraceFormat, "TableStorageHelper::CreateTableIfNotExist", storageAccount.Credentials.AccountName,
    tableName, args.CurrentRetryCount, args.Delay);
    TraceHelper.TraceError(message, args.LastException);
    };
    try
    {
    var isTableCreated = retryPolicy.ExecuteAction(() =>
    {
    var table = storageAccount.CreateCloudTableClient().GetTableReference(tableName);
    return table.CreateIfNotExists(requestOptions, operationContext);
    });
    return isTableCreated;
    }
    catch (Exception)
    {
    throw;
    }

在上面的代码示例中,如果我愿意,我可以拦截重试操作并在那里执行某些操作。这对于存储客户端库来说是不可能的。

话虽如此,通常建议使用存储客户端库重试策略来重试存储操作,因为它是包的组成部分,因此将与库的最新更改保持同步。

关于c#-4.0 - tableclient.RetryPolicy 对比 transient 故障处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18969660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com