|
|
51CTO旗下网站
|
|
移动端

3.3.4 使用重试策略

《Microsoft Azure 管理与开发(下册)平台服务PaaS》本书由世纪互联蓝云Microsoft Azure 开发技术支持团队的资深工程师们编写,主要阐述MicrosoftAzure PaaS 服务的开发应用,涉及计算服务、集成认证服务、数据存储服务、大数据服务等方面的内容。本节为大家介绍使用重试策略。

作者:世纪互联蓝云公司来源:电子工业出版社|2018-07-13 12:22

3.3.4 使用重试策略

在使用云服务时,会不可避免地面临网络短暂性故障的问题,有可能是客户端或数据中心层面的网络发生这类情况。这种情况通常称之为Transient Fault,即短暂性异常。处理这种异常,最简单有效的办法是执行重试机制。目前,大部分客户端SDK 都提供了一些重试策略。以下内容基于.NET 版本的存储客户端进行说明。

1. LinearRetry

线性重试策略,即按相等时间间隔尝试一定次数的重试请求,如图3.3.4-1 所示。

使用LinearRetry 的方法如下:

  1. CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();  
  2. IRetryPolicy linearRetry = new LinearRetry(TimeSpan.FromSeconds(2), 5);  
  3. blobClient.RetryPolicy = linearRetry;  
  4. CloudBlobContainer blobContainer = blobClient.GetContainerReference( "  
  5. container");  
  6. blobContainer.Create(requestOptions); 

2. ExponentialRetry

指数递增重试策略,即每一次重试的时间间隔都是之前的指数倍数,如图3.3.4-2 所示。

使用ExponentialRetry 的方法如下:

  1. CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();  
  2. IRetryPolicy exponentialRetry = new ExponentialRetry (TimeSpan.FromSeconds(2),  
  3. 5);  
  4. blobClient.RetryPolicy = exponentialRetry;  
  5. CloudBlobContainer blobContainer = blobClient.GetContainerReference( "  
  6. container");  
  7. blobContainer.Create(); 

3. NoRetry

不重试,用来配合其他重试策略辅助使用。在某种情况下,为整体行为进行了某种重试策略,但在某个子行为上需要取消重试机制时,可以使用该策略进行控制。使用ExponentialRetry 的方法如下:

  1. CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();  
  2. IRetryPolicy linearRetry = new LinearRetry(TimeSpan.FromSeconds(2), 5);  
  3. blobClient.RetryPolicy = linearRetry;  
  4. CloudBlobContainer blobContainer = blobClient.GetContainerReference  
  5. ("container");  
  6. IRetryPolicy noRetryPolicy = new NoRetry();  
  7. BlobRequestOptions requestOptions = new BlobRequestOptions()  
  8. {  
  9. RetryPolicy = noRetryPolicy,  
  10. };  
  11. blobContainer.Create(requestOptions); 

4. 自定义Retry

除了默认的重试策略以外,还可以通过IExtendedRetryPolicy 接口来扩展现有策略。实现类需要实现“ShouldRetry”方法。正常情况下,删除存储账户容器后,如果立即创建同名容器,很可能会收到409 冲突错误。实现示例代码如下:

  1. public class ContainerBeingDeletedRetryPolicy : IRetryPolicy  
  2. {  
  3. int maxRetryAttemps = 5;  
  4. TimeSpan defaultRetryInterval = TimeSpan.FromSeconds(5);  
  5. public ContainerBeingDeletedRetryPolicy(TimeSpan deltaBackoff, int  
  6. retryAttempts)  
  7. {  
  8. maxRetryAttemps = retryAttempts;  
  9. defaultRetryInterval = deltaBackoff;  
  10. }  
  11. public IRetryPolicy CreateInstance()  
  12. {  
  13. return new ContainerBeingDeletedRetryPolicy(TimeSpan.FromSeconds  
  14. (2), 5);  
  15. }  
  16. public bool ShouldRetry(int currentRetryCount, int statusCode, Exception  
  17. lastException, out TimeSpan retryInterval, OperationContext operationContext)  
  18. {  
  19. retryInterval = defaultRetryInterval;  
  20. if (currentRetryCount >= maxRetryAttemps)  
  21. {  
  22. return false;  
  23. }  
  24. if ((HttpStatusCode)statusCode != HttpStatusCode.Conflict)  
  25. {  
  26. return false;  
  27. }  
  28. if (lastException.GetType() != typeof(StorageException))  
  29. {  
  30. return false;  
  31. }  
  32. else  
  33. {  
  34. var storageException = (StorageException)lastException;  
  35. string errorCode = storageException.RequestInformation.  
  36. ExtendedErrorInformation.ErrorCode;  
  37. if (errorCode.Equals("ContainerBeingDeleted"))  
  38. {  
  39. return true;  
  40. }  
  41. else  
  42. {  
  43. return false;  
  44. }  
  45. }  
  46. return true;  
  47. }  

要使用自定义重试策略,代码很简单。为了模拟这个“ContainerBeingDeleted”条件,创建一个blob 容器,删除后立即尝试重新创建,如下面的代码所示。

  1. string blobContainerName = "temp-" + DateTime.UtcNow.Ticks;  
  2. CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();  
  3. IRetryPolicy linearRetryPolicy = new LinearRetry(TimeSpan.FromSeconds(2),  
  4. 10);  
  5. blobClient.RetryPolicy = linearRetryPolicy;  
  6. CloudBlobContainer blobContainer = blobClient.GetContainerReference  
  7. (blobContainerName);  
  8. blobContainer.Create();  
  9. Console.WriteLine("Blob container created.");  
  10. blobContainer.Delete();  
  11. Console.WriteLine("Blob container deleted.");  
  12. IRetryPolicy containerBeingDeletedRetryPolicy = new 
  13. ContainerBeingDeletedRetryPolicy(TimeSpan.FromSeconds(2), 10);  
  14. BlobRequestOptions requestOptions = new BlobRequestOptions()  
  15. {  
  16. RetryPolicy = containerBeingDeletedRetryPolicy,  
  17. };  
  18. blobContainer.Create(requestOptions);  
  19. Console.WriteLine("Blob container created.");  
  20. Console.ReadLine(); 


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

网络工程师必读——网络系统设计

本书是一本真正意义上的网络系统设计图书,从网络系统设计角度全面介绍了整个网络系统设计的思路和方法,而不是像传统网络集成类图书那样主...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊