首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tableclient.RetryPolicy Vs.TransientFaultHandling

tableclient.RetryPolicy Vs.TransientFaultHandling
EN

Stack Overflow用户
提问于 2013-09-23 22:03:45
回答 1查看 2.2K关注 0票数 7

我和一位同事都负责为Azure表存储找到连接重试逻辑。经过一些搜索,我发现了这个非常酷的企业库套件,它包含Microsoft.Practices.TransientFaultHandling命名空间。

在下面的几个代码示例中,我创建了一个Incremental重试策略,并使用retryPolicyExecuteAction回调处理程序包装了一个存储调用:

代码语言:javascript
复制
/// <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对象已经有了一个重试策略的设置器。他的代码看起来像:

代码语言:javascript
复制
/// <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;
        }
}

我的问题:

除了它们的实现之外,这两种方法之间有什么重大区别吗?他们似乎都实现了相同的目标,但是否有更好的情况下使用一个而另一个呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-24 03:47:58

从功能上讲,两者是相同的--它们都会在发生瞬态错误时重试请求。然而,差别很小:

  • 存储客户端库中的重试策略处理只处理存储操作的重试,而瞬态故障处理重试不仅处理存储操作,而且在发生瞬态错误时重试SQL Azure、Service Bus和Cache操作。因此,如果您有一个项目,其中您使用更多的存储,但希望只有一种方法来处理瞬态错误,您可能需要使用瞬态故障处理应用程序块。
  • 关于瞬态故障处理块,我喜欢的一件事是,您可以拦截重试操作,而重试策略是无法执行的。例如,查看下面的代码: var retryManager = retryManager.GetRetryPolicy(ConfigurationHelper.ReadFromServiceConfigFile(Constants.DefaultRetryStrategyForTableStorageOperationsKey));var retryPolicy =retryManager.GetRetryPolicy(ConfigurationHelper.ReadFromServiceConfigFile(Constants.DefaultRetryStrategyForTableStorageOperationsKey));retryPolicy.Retrying += (发送方,args) => { //日志重试的详细信息。var message = string.Format(CultureInfo.InvariantCulture,TableOperationRetryTraceFormat,"TableStorageHelper::CreateTableIfNotExist",storageAccount.Credentials.AccountName,tableName,args.CurrentRetryCount,args.Delay);TraceHelper.TraceError(message,args.LastException);};);返回isTableCreated;} catch (异常){抛出;}

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

尽管如此,通常建议采用存储客户端库重试策略来重试存储操作,因为它是包的一个组成部分,因此将不断更新对库的最新更改。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18969660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档