使用 .NET 實作重試原則
在雲端中執行或與遠端服務和資源通訊的任何應用程式都必須能夠處理暫時性錯誤。 這些應用程式通常會因為網路連線短暫中斷、服務或資源忙碌時的要求逾時,或其他因素而遇到錯誤。 開發人員應該建置應用程式,以透明方式處理暫時性錯誤,進而改善穩定性和復原能力。
在本文中,您將瞭解如何使用適用於 .NET 的 Azure 儲存體 客戶端連結庫,為聯機至 Azure Blob 儲存體 的應用程式設定重試原則。 重試原則會定義應用程式如何處理失敗的要求,而且應該一律進行調整,以符合應用程式的商務需求和失敗的性質。
設定重試選項
Blob 儲存體的重試原則是以程式設計方式設定,可控制如何將重試選項套用至各種服務要求和案例。 例如,根據使用者互動發出要求的 Web 應用程式,可能會實作具有較少重試和較短延遲的原則,以增加回應性並在發生錯誤時通知使用者。 或者,在背景中執行批次要求的應用程式或元件可能會增加重試次數,並使用指數輪詢策略來允許要求時間順利完成。
下表列出 RetryOptions 類別的屬性,以及類型、簡短描述,以及未進行任何變更的預設值。 您應該主動調整這些屬性的值,以符合應用程式的需求。
屬性 | 類型 | 描述 | 預設值 |
---|---|---|---|
Delay | TimeSpan | 固定方法的重試嘗試之間的延遲,或要針對輪詢型方法進行基礎計算的延遲。 如果服務提供 Retry-After 回應標頭,則下一次重試會延遲標頭值所指定的持續時間。 | 0.8 秒 |
MaxDelay | TimeSpan | 當服務未提供 Retry-After 回應標頭時,重試嘗試之間的允許延遲上限。 如果服務提供 Retry-After 回應標頭,則下一次重試會延遲標頭值所指定的持續時間。 | 1 分鐘 |
MaxRetries | int | 放棄之前重試次數上限。 | 5 |
模式 | RetryMode | 用於計算重試延遲的方法。 | 指數 |
NetworkTimeout | TimeSpan | 套用至個別網路作業的逾時。 | 100 秒 |
在此 Blob 儲存體程式碼範例中,我們會在 BlobClientOptions 類別的 Retry
屬性中設定重試選項。 然後,我們會使用重試選項,為 Blob 服務建立用戶端物件。
// Provide the client configuration options for connecting to Azure Blob Storage
BlobClientOptions blobOptions = new BlobClientOptions()
{
Retry = {
Delay = TimeSpan.FromSeconds(2),
MaxRetries = 5,
Mode = RetryMode.Exponential,
MaxDelay = TimeSpan.FromSeconds(10),
NetworkTimeout = TimeSpan.FromSeconds(100)
},
};
BlobServiceClient blobServiceClient = new BlobServiceClient(
accountUri,
new DefaultAzureCredential(),
blobOptions);
在此範例中,從 BlobServiceClient
物件發出的每個服務要求都會使用 BlobClientOptions
物件中所定義的重試選項。 您可以根據應用程式的需求,為服務用戶端設定各種重試策略。
使用異地備援來改善應用程式復原能力
如果您的應用程式需要高可用性和更大的失敗復原能力,您可以利用 Azure 儲存體異地備援選項作為重試原則的一部分。 針對異地備援複寫設定的儲存體帳戶,會以同步方式複寫至主要區域,然後以非同步方式複寫至數百英里外的次要區域。
Azure 儲存體提供異地備援複寫的兩個選項:異地備援儲存體 (GRS) 和異地區域備援儲存體 (GZRS)。 除了啟用儲存體帳戶的異地備援之外,您也需要設定次要區域中資料的讀取權限。 若要了解如何變更儲存體帳戶的複寫選項,請參閱變更儲存體帳戶的複寫方式。
在此範例中,我們會在 BlobClientOptions
中設定 GeoRedundantSecondaryUri 屬性。 如果設定此屬性,次要 URI 會用於重試期間 GET
或 HEAD
要求。 如果來自次要 URI 的回應狀態為 404,則要求的後續重試不會再次使用次要 URI,因為此狀態碼表示資源可能尚未傳播到該處。 否則,後續重試在主要和次要 URI 之間來回切換。
Uri secondaryAccountUri = new Uri($"https://{accountName}-secondary.blob.core.windows.net/");
// Provide the client configuration options for connecting to Azure Blob Storage
BlobClientOptions blobOptionsGRS = new BlobClientOptions()
{
Retry = {
Delay = TimeSpan.FromSeconds(2),
MaxRetries = 5,
Mode = RetryMode.Exponential,
MaxDelay = TimeSpan.FromSeconds(10),
NetworkTimeout = TimeSpan.FromSeconds(100)
},
// Set the secondary storage URI
GeoRedundantSecondaryUri = secondaryAccountUri
};
BlobServiceClient blobServiceClient = new BlobServiceClient(
accountUri,
new DefaultAzureCredential(),
blobOptionsGRS);
使用異地備援的應用程式必須記住一些特定設計考慮。 若要深入了解,請參閱使用異地備援來設計高可用性應用程式。