Azure Storage Client Library 重试策略建议
有关如何配置 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 执行此项测试并为本文章提供内容。
Azure Storage Client Library 重试策略建议的更多相关文章
- Windows Azure Storage Client Library 2.0 入门
入门连接如下: http://gauravmantri.com/2012/11/17/storage-client-library-2-0-migrating-table-storage-code/
- Getting Started(Google Cloud Storage Client Library)
在运行下面的步骤之前,请确保: 1.你的项目已经激活了Google Cloud Storage和App Engine,包括已经创建了至少一个Cloud Storage bucket. 2.你已经下载了 ...
- Downloading the Google Cloud Storage Client Library
Google Cloud Storage client是一个客户端库,与任何一个生产环境使用的App Engine版本都相互独立.如果你想使用App Engine Development server ...
- 细说 Azure Storage 的冗余策略
当我们想要把应用搬到云端的时候,首先要关注的便是数据的安全性.当然所有的云服务厂商都会对用户数据承诺一个非常高的安全性,但万一出现意外呢?我们是不是还要有适当的应对方案?比如今年的3月8日晚间,Azu ...
- Windows Azure Storage 之 Retry Policy (用来处理短暂性错误-Transient Fault)
在使用Windows Azure Storage Service 的时候, 通常会遇到各种各样的问题. 例如网络连接不稳定,导致请求没有发出去.删除一个Blob Container 之后又立刻创建同名 ...
- 直传文件到Azure Storage的Blob服务中
(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注.) 题记:为了庆祝获得微信公众号赞赏功能,忙里抽闲分享一下最近工作的一点心得:如何直接从浏览器中上传文件到Azure ...
- [转]探索 Windows Azure Storage
本文转自:https://msdn.microsoft.com/zh-tw/jj573842 概觀 儲存服務 (Storage services) 在 Windows Azure 運算模擬器中提供了可 ...
- 【Azure 存储服务】代码版 Azure Storage Blob 生成 SAS (Shared Access Signature: 共享访问签名)
问题描述 在使用Azure存储服务,为了有效的保护Storage的Access Keys.可以使用另一种授权方式访问资源(Shared Access Signature: 共享访问签名), 它的好处可 ...
- Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...
随机推荐
- c语言结构体数组引用
struct dangdang { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; }dbdd[]={{,,}, {,,} };//初始化 void m ...
- http2.0 相对于 http1.1的优势
1.http2.0完全是多路复用的,只需一个连接就可实现并行 可以将不同的请求夹杂在一起,只需一个连接就能加载一个页面. 2.可以让服务器将响应主动推动到客户端缓存中 当浏览器请求一个网页时,服务器除 ...
- WPF与输入法冲突研究之二:汉字输入法会导致WPF程序的崩溃!
如果是输入非汉字的数据信息,可以添加一下内容: xmlns:input="clr-namespace:System.Windows.Input;assembly=PresentationCo ...
- java如何从方法返回多个值
本文介绍三个方法,使java方法返回多个值. 方法1:使用集合类 方法2:使用封装对象 方法3:使用引用传递 示例代码如下: import java.util.HashMap; import java ...
- Ruby中,类方法和实例方法的一个有趣的例子
最初的代码如下: class Object def abc p "instance abc" end def self.abc p "class abc" en ...
- JavaScript 滚动页面到指定元素位置
页面评论功能,当评论较多时,有时须要滚动到评论头部. 能够使用scrollTop方法,加上一点延时动画(animate),可訪问在线演示,代码大体例如以下: <html> <scri ...
- gcc/g++/make 编译信息带颜色输出
假设编译一个项目错误警告太多.很不好找,所以很希望输出信息能够带有颜色. 但是 gcc 4.9.0 之前的版本号并不支持,非常多情况下是不能替换编译器的,比方使用交叉编译器, 也能够使用 colorg ...
- install-file -Dfile=J:\project01\workspace\service\lib\javapns-jdk16-163.jar -DgroupId=org.json -Dar
今天在开发项目的时候发现了一个问题,所以通过博客来记录起来! 为了以后在问题的解决方面能得到借鉴! 问题的现象是这种: 这样会报错的.pom.xml文件他在编译.检查他的文件语法的时候是须要參考库中的 ...
- 初探HTML
就在今天我抱着试一试的态度稍微看了下HTML5, 尝试着接触一点新知识, 虽然学的并不多, 但是还是异常的兴奋, 感觉有好多东西和之前的不一样了, 包括控件的创建和一些属性的设置等, 总之这些变化与改 ...
- 编译U-boot时,make[1]: *** 没有规则可以创建mkimage.o”
执行完make smdk2440_config 对Uboot重行编译怎么会出现这样的错误 make[1]: Entering directory `/home/win/S3-ARM/Part4/ubo ...