有关如何配置 Azure Storage Library
重试策略的信息,可参阅 Gaurav Mantri
撰写的一篇不错的文章《SCL
2.0 – 实施重试策略》
。但很难找到关于使用何种重试策略设置的实用指导。本文章提供的建议是基于Microsoft
团队在高负载场景中使用SCL
的实际体验(对于低流量场景,使用默认的重试策略即可)。

ExponentialRetry与LinearRetry

对于不必考虑维持较短的响应时间的批处理,ExponentialRetry
类似乎是首选方法。您希望可以快速重试,以确保在最短的时间内清除瞬态错误,但您又不想给服务器带来过多压力,致使早已存在故障的服务产生更多的问题。而且,AzureStorage
团队正在不断调整策略,以使其具有更高的智能性,提供最佳的整体性能。

但是,想想这对您跟踪
Storage 服务连接质量的能力的影响。如果使用超时时间久且重试次数多的
ExponentialRetry,您可以不必处理大多数瞬态错误的异常,但也不会知道其是否会频繁出现。您可以跟踪响应时间,但却不会知道其原因是否是瞬态错误。

一种解决方案是使用
OperationContext.RequestResults,其中包含客户端库在表层下执行的每个操作的结果。OperationContext
还提供端到端的跟踪,这有助于在分布式系统中诊断问题。如果需要收到关于重试的通知,可使用一个名为
OperationContext.Retrying
的新事件。遗憾的是,目前还没有说明如何使用 OperationContext
的示例文档。

如果需要更多的诊断信息,还可以选择使用重试间隔短且重试次数少的 LinearRetry
类,以便出现持久故障时更快速地发现。之后您可以一边报告故障,一边捕获异常并实施备用策略。请注意,如果希望大多数的请求最终成功,备用策略非常重要。

MaximumExecutionTime

IRequestOptions
接口还包括一个
MaximumExecutionTime
属性。该值用于限制在所有重试上所花的总时间。根据您所执行的操作类型,该值可能需要比较大,因为大型操作需要一段时间才会出现故障。在要求大型操作的高负载条件下,我们发现,如果该值低于
秒,将产生许多故障。将
MaximumExecutionTime 设置为 60
秒可避免异常。这种情况非常适合后台处理程序:对于面向客户的场景,您需要进行不同的调整。

我们发现,ServerTimeout

maximum numberof retries
值产生的影响不会很大。我们将其设置为 5
秒和 10
次重试,系统工作正常。而且,这是针对后台进程的优化,相对于快速响应时间,我们更关注最终的成功。此外,这种设置并不适用于所有的场景-
例如,如果您的应用程序正在下载 1TB
的 Blob,那么
5 秒的时间就不够长。如果不希望超时,也可以选择将 ServerTimeout
设置为 Null。从
StorageClient Library 4.0 开始,Null
将为默认值。

避免不必要的工作

对于某些操作,SCL
API 提供了 IfExist
方法,可使用这种方法避免异常:示例:

foreach (IListBlobItem blobItem inthis.BlobList())

{

CloudBlockBlob cloudBlob = (CloudBlockBlob)blobItem;

cloudBlob.DeleteIfExists(options:this.requestOptions);

}

这看起来像是良好的防御性编程,事实也的确如此,不过这也增加了出现故障和增加流量的其他可能。在我们的压力测试中,这种方法经常会出现故障。如果知道存在某个项目,那么这种方法是没有必要的。更改代码以调用
Delete
而非
DeleteIfExists,可以更好地执行操作,出现的故障也更少。因此,最好使用已知信息来减少流量和出现故障的可能性。

处理异常

即使是相对宽松的重试策略,有时候错误也会持续较长时间,从而产生异常。AzureStorage
Client 框架可以有效地确保这些异常属于
StorageException
或 System.AggregateException

此外,重试策略类不会重试
4xx 状态代码。也有一些其他状态代码(当前是、501
和)不会重试。这些代码表示该异常不属于瞬态错误,
因此需要您处理。常见示例为(未找到)和(冲突)。如果编写自定义重试策略,务必确保检查这些情况。

不必要的包装库

我们从
Azure Storage Client 开始,规划设计可以按照我们希望的方式执行重试的包装库。但结果表明这是没有必要的。我们仍着眼于编写业务逻辑库,将我们的重试调整和错误处理集中起来,但这些库要基于Azure
Storage Client 代码。

感谢
Allen Prescott 执行此项测试并为本文章提供内容。

本文翻译自:http://azure.microsoft.com/blog/2014/05/22/azure-storage-client-library-retry-policy-recommendations/



Azure Storage Client Library 重试策略建议的更多相关文章

  1. Windows Azure Storage Client Library 2.0 入门

    入门连接如下: http://gauravmantri.com/2012/11/17/storage-client-library-2-0-migrating-table-storage-code/

  2. Getting Started(Google Cloud Storage Client Library)

    在运行下面的步骤之前,请确保: 1.你的项目已经激活了Google Cloud Storage和App Engine,包括已经创建了至少一个Cloud Storage bucket. 2.你已经下载了 ...

  3. Downloading the Google Cloud Storage Client Library

    Google Cloud Storage client是一个客户端库,与任何一个生产环境使用的App Engine版本都相互独立.如果你想使用App Engine Development server ...

  4. 细说 Azure Storage 的冗余策略

    当我们想要把应用搬到云端的时候,首先要关注的便是数据的安全性.当然所有的云服务厂商都会对用户数据承诺一个非常高的安全性,但万一出现意外呢?我们是不是还要有适当的应对方案?比如今年的3月8日晚间,Azu ...

  5. Windows Azure Storage 之 Retry Policy (用来处理短暂性错误-Transient Fault)

    在使用Windows Azure Storage Service 的时候, 通常会遇到各种各样的问题. 例如网络连接不稳定,导致请求没有发出去.删除一个Blob Container 之后又立刻创建同名 ...

  6. 直传文件到Azure Storage的Blob服务中

    (此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注.) 题记:为了庆祝获得微信公众号赞赏功能,忙里抽闲分享一下最近工作的一点心得:如何直接从浏览器中上传文件到Azure ...

  7. [转]探索 Windows Azure Storage

    本文转自:https://msdn.microsoft.com/zh-tw/jj573842 概觀 儲存服務 (Storage services) 在 Windows Azure 運算模擬器中提供了可 ...

  8. 【Azure 存储服务】代码版 Azure Storage Blob 生成 SAS (Shared Access Signature: 共享访问签名)

    问题描述 在使用Azure存储服务,为了有效的保护Storage的Access Keys.可以使用另一种授权方式访问资源(Shared Access Signature: 共享访问签名), 它的好处可 ...

  9. Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...

随机推荐

  1. c语言结构体数组引用

    struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; }dbdd[]={{,,}, {,,} };//初始化 void m ...

  2. http2.0 相对于 http1.1的优势

    1.http2.0完全是多路复用的,只需一个连接就可实现并行 可以将不同的请求夹杂在一起,只需一个连接就能加载一个页面. 2.可以让服务器将响应主动推动到客户端缓存中 当浏览器请求一个网页时,服务器除 ...

  3. WPF与输入法冲突研究之二:汉字输入法会导致WPF程序的崩溃!

    如果是输入非汉字的数据信息,可以添加一下内容: xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCo ...

  4. java如何从方法返回多个值

    本文介绍三个方法,使java方法返回多个值. 方法1:使用集合类 方法2:使用封装对象 方法3:使用引用传递 示例代码如下: import java.util.HashMap; import java ...

  5. Ruby中,类方法和实例方法的一个有趣的例子

    最初的代码如下: class Object def abc p "instance abc" end def self.abc p "class abc" en ...

  6. JavaScript 滚动页面到指定元素位置

    页面评论功能,当评论较多时,有时须要滚动到评论头部. 能够使用scrollTop方法,加上一点延时动画(animate),可訪问在线演示,代码大体例如以下: <html> <scri ...

  7. gcc/g++/make 编译信息带颜色输出

    假设编译一个项目错误警告太多.很不好找,所以很希望输出信息能够带有颜色. 但是 gcc 4.9.0 之前的版本号并不支持,非常多情况下是不能替换编译器的,比方使用交叉编译器, 也能够使用 colorg ...

  8. install-file -Dfile=J:\project01\workspace\service\lib\javapns-jdk16-163.jar -DgroupId=org.json -Dar

    今天在开发项目的时候发现了一个问题,所以通过博客来记录起来! 为了以后在问题的解决方面能得到借鉴! 问题的现象是这种: 这样会报错的.pom.xml文件他在编译.检查他的文件语法的时候是须要參考库中的 ...

  9. 初探HTML

    就在今天我抱着试一试的态度稍微看了下HTML5, 尝试着接触一点新知识, 虽然学的并不多, 但是还是异常的兴奋, 感觉有好多东西和之前的不一样了, 包括控件的创建和一些属性的设置等, 总之这些变化与改 ...

  10. 编译U-boot时,make[1]: *** 没有规则可以创建mkimage.o”

    执行完make smdk2440_config 对Uboot重行编译怎么会出现这样的错误 make[1]: Entering directory `/home/win/S3-ARM/Part4/ubo ...