瞭解 Azure Resource Manager 如何節流要求
本文描述 Azure Resource Manager 如何節流要求。 其會說明如何在達到限制之前追蹤剩餘的要求數目,以及當您達到限制時如何回應。
節流會在兩個層級發生。 Azure Resource Manager 會對訂用帳戶和租用戶的要求進行節流。 如果要求在訂用帳戶和租用戶的節流限制下,Resource Manager 會將要求路由至資源提供者。 資源提供者會套用針對其作業量身訂做的節流限制。
下圖說明當使用者向 Azure Resource Manager 和資源提供者提出要求時,系統將如何套用節流。 圖片顯示要求一開始是依據每個主體識別碼進行節流,以及依據使用者傳送要求所在區域中的每個 Azure Resource Manager 執行個體進行節流。 要求會每小時進行節流。 要求轉接至資源提供者時,要求會依據每個資源區域進行節流,而不是依據使用者區域中的每個 Azure Resource Manager 執行個體進行節流。 資源提供者要求也會依據每個主體使用者識別碼和每小時進行節流。
訂用帳戶和租用戶限制
每個訂用帳戶層級和租用戶層級作業受限於節流限制。 訂用帳戶要求會涉及傳遞訂用帳戶識別碼,例如擷取訂用帳戶中的資源群組。 例如,將要求傳送至 https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups?api-version=2022-01-01
是訂用帳戶層級的作業。 租用戶要求則未包含訂用帳戶識別碼,例如擷取有效的 Azure 位置。 例如,將要求傳送至 https://management.azure.com/tenants?api-version=2022-01-01
是訂用帳戶層級的作業。
下表顯示預設的每小時節流限制。
範圍 | Operations | 限制 |
---|---|---|
訂用帳戶 | reads | 12000 |
訂用帳戶 | deletes | 15000 |
訂用帳戶 | writes | 1200 |
租用戶 | reads | 12000 |
租用戶 | writes | 1200 |
這些限制會侷限在提出要求的安全性主體 (使用者或應用程式),以及訂用帳戶識別碼或租用戶識別碼。 如果您的要求來自多個安全性主體,則訂用帳戶或租用戶之間的限制會大於每小時 12,000 個和 1,200 個。
這些限制適用於每個 Azure Resource Manager 執行個體。 每個 Azure 區域中都有多個執行個體,且 Azure Resource Manager 會部署到所有 Azure 區域。 因此在實務上,該限制會高於這些限制。 使用者的要求通常是由 Azure Resource Manager 的不同執行個體處理。
剩餘的要求會在回應標頭值中傳回。
移轉至區域性節流和權杖貯體演算法
從 2024 年開始,Microsoft將 Azure 訂用帳戶移轉至新的節流架構。 透過這項變更,您將體驗新的節流限制。 新的節流限制會依據區域套用,而不是依據 Azure Resource Manager 的執行個體套用。 新的架構會使用權杖貯體演算法來管理 API 節流。
權杖貯體代表您每秒可傳送的要求數目上限。 當您達到要求數目上限時,重填率會決定權杖在貯體中變成可用的速度。
這些更新的限制可讓您更輕鬆地重新整理和管理您的配額。
新的限制如下:
範圍 | Operations | 貯體大小 | 每秒的重填率 |
---|---|---|---|
訂用帳戶 | reads | 250 | 25 |
訂用帳戶 | deletes | 200 | 10 |
訂用帳戶 | writes | 200 | 10 |
租用戶 | reads | 250 | 25 |
租用戶 | deletes | 200 | 10 |
租用戶 | writes | 200 | 10 |
訂用帳戶限制會依據訂用帳戶、依據服務主體和依據作業類型套用。 也有相當於每個作業類型個別服務主體限制 15 倍的全域訂用帳戶限制。 全域限制適用於所有服務主體。 如果超過全域、服務主體或租用戶特定限制,要求將會受到節流。
免費或試用版客戶的限制可能比較小。
例如,假設您的貯體大小為可供讀取要求使用的 250 個權杖,而重填率為每秒 25 個權杖。 如果您在一秒內傳送 250 個讀取要求,則貯體是空的且您的要求會受到節流。 每秒有 25 個權杖可供使用,直到貯體達到最大容量 250 個權杖為止。 您可以在權杖可用時使用權杖。
使用 */providers/microsoft.insights/metrics
API 讀取計量可大幅貢獻整體 Azure Resource Manager 流量,而且是訂用帳戶節流事件的常見原因。 如果您大量使用此 API,建議您切換至 getBatch
API。 您可以在單一 REST 要求中查詢多個資源,以提升效能並減少節流。 如需轉換作業的詳細資訊,請參閱 如何從計量 API 遷移至 getBatch API。
如何知道我的訂用帳戶使用新的節流體驗?
將訂用帳戶移轉至新的節流體驗之後,回應標頭會顯示每分鐘剩餘的要求,而不是每小時剩餘的要求。 此外,您的 Retry-After
值會顯示一分鐘或更短,而不是五分鐘。 如需詳細資訊,請參閱錯誤碼。
為何節流會依據區域變更,而不是依據執行個體變更?
由於不同區域有不同的 Resource Manager 執行個體數目,因此依據執行個體進行節流會導致節流效能不一致。 依據區域進行節流可讓節流保持一致且可預測。
新的節流體驗如何影響我的限制?
您可以傳送更多要求。 寫入要求增加 30 倍。 刪除要求增加 2.4 倍。 讀取要求增加 7.5 倍。
我是否可防止訂用帳戶移轉至新的節流體驗?
否,所有訂用帳戶最終都會移轉。
資源提供者限制
資源提供者會套用自己的節流限制。 在每個訂用帳戶內,資源提供者會對要求中的每個資源區域進行節流。 由於 Resource Manager 會依 Resource Manager 的執行個體進行節流,且每個區域會有多個 Resource Manager 執行個體,因此資源提供者可能會收到比上一節中預設限制更多的要求。
本節會討論一些廣泛使用資源提供者的節流限制。
儲存體節流
只有在使用 Azure Resource Manager 搭配 Azure 儲存體來執行管理作業時,才會套用下列限制。 這些限制會套用在要求中的每個資源區域。
資源 | 限制 |
---|---|
儲存體帳戶的管理作業 (讀取) | 每 5 分鐘 800 |
儲存體帳戶管理作業 (寫入) | 每秒 10 個/每小時 1,200 個 |
儲存體帳戶的管理作業 (清單) | 每 5 分鐘 100 |
網路節流
Microsoft.Network 資源提供者會套用下列節流限制:
作業 | 限制 |
---|---|
寫入/刪除 (PUT) | 每 5 分鐘 1000 次 |
讀取 (GET) | 每 5 分鐘 10000 次 |
除了這些一般限制之外,請參閱 Azure DNS 的使用限制。
計算節流
Microsoft Compute 會實作節流,為虛擬機器和虛擬機器擴展集使用者提供最佳體驗。 計算節流限制提供 VM、虛擬機器擴展集和擴展集 VM 節流原則和限制的詳盡資訊。
Azure Resource Graph 節流
Azure Resource Graph 會限制其作業的要求數目。 本文用來判斷剩餘的要求,以及當達到限制時如何回應的步驟,也適用於 Resource Graph。 不過,Resource Graph 會設定自己的限制和重設速率。 如需詳細資訊,請參閱 Resource Graph 節流標頭。
其他資源提供者
如需其他資源提供者中節流的詳細資訊,請參閱:
錯誤碼
當您到達限制時,您會收到 HTTP 狀態碼 429 太多要求。 回應會包含 Retry-After 值,指定應用程式在傳送下一個要求之前所應等待 (或睡眠) 的秒數。 如果重試值沒過您就傳送要求,則不會處理要求,並且會傳回新重試值。
如果您使用 Azure SDK,SDK 可能會具有自動重試設定。 如需詳細資訊,請參閱 Azure 服務的重試指導。
某些資源提供者會傳回 429 來回報暫時性問題。 該問題可能是要求間接導致的多載情況。 或者,其可能代表目標資源或相依資源狀態的暫時性錯誤。 例如,當目標資源由其他作業鎖定時,網路資源提供者會傳回 429,並傳回 RetryableErrorDueToAnotherOperation 錯誤碼。 若要判斷錯誤是否來自節流或暫時性狀況,請檢視回應中的錯誤詳細資料。
剩餘的要求
您可以藉由檢查回應標頭來判斷剩餘的要求數。 讀取要求會針對剩餘的讀取要求數目,在標頭中傳回值。 寫入要求包含剩餘寫入要求數目的值。 下表描述可供檢查這些值的回應標頭︰
回應標頭 | 描述 |
---|---|
x-ms-ratelimit-remaining-subscription-deletes | 受訂用帳戶限制的剩餘刪除。 刪除作業會傳回此值。 |
x-ms-ratelimit-remaining-subscription-reads | 受訂用帳戶限制的剩餘讀取。 讀取作業會傳回此值。 |
x-ms-ratelimit-remaining-subscription-writes | 受訂用帳戶限制的剩餘寫入。 寫入作業會傳回此值。 |
x-ms-ratelimit-remaining-tenant-reads | 受租用戶限制的剩餘讀取 |
x-ms-ratelimit-remaining-tenant-writes | 受租用戶限制的剩餘寫入 |
x-ms-ratelimit-remaining-subscription-resource-requests | 受訂用帳戶限制的剩餘資源類型要求。 只有服務覆寫預設限制,才會傳回此標頭值。 Resource Manager 會新增此值,而非訂用帳戶讀取或寫入。 |
x-ms-ratelimit-remaining-subscription-resource-entities-read | 受訂用帳戶限制的剩餘資源類型集合要求。 只有服務覆寫預設限制,才會傳回此標頭值。 這個值會提供剩餘的集合要求 (列出資源) 數目。 |
x-ms-ratelimit-remaining-tenant-resource-requests | 受租用戶限制的剩餘資源類型要求。 只有服務覆寫預設限制,才會針對租用戶層級的要求新增此標頭。 Resource Manager 會新增此值,而非租用戶讀取或寫入。 |
x-ms-ratelimit-remaining-tenant-resource-entities-read | 受租用戶限制的剩餘資源類型集合要求。 只有服務覆寫預設限制,才會針對租用戶層級的要求新增此標頭。 |
資源提供者也可以傳回回應標頭,其中包含剩餘要求的相關資訊。 如需由計算資源提供者傳回的回應標頭詳細資訊,請參閱呼叫率資訊回應標頭。
擷取標頭值
在程式碼或指令碼中擷取這些標頭值與擷取任何標頭值並無不同。
例如,在 C# 中,您可以使用下列程式碼從 HttpWebResponse 物件 (名為 response) 擷取標頭值︰
response.Headers.GetValues("x-ms-ratelimit-remaining-subscription-reads").GetValue(0)
在 PowerShell 中,您可以從 Invoke-WebRequest 作業擷取標頭值。
$r = Invoke-WebRequest -Uri https://management.azure.com/subscriptions/{guid}/resourcegroups?api-version=2016-09-01 -Method GET -Headers $authHeaders
$r.Headers["x-ms-ratelimit-remaining-subscription-reads"]
如需完整的 PowerShell 範例,請參閱 Check Resource Manager Limits for a Subscription (檢查訂用帳戶的 Resource Manager 限制)。
如果您想要查看可用於偵錯的剩餘要求,您可以在 PowerShell Cmdlet 提供 -Debug 參數。
Get-AzResourceGroup -Debug
這會傳回許多值,包括下列回應值︰
DEBUG: ============================ HTTP RESPONSE ============================
Status Code:
OK
Headers:
Pragma : no-cache
x-ms-ratelimit-remaining-subscription-reads: 11999
若要取得寫入限制,請使用寫入作業:
New-AzResourceGroup -Name myresourcegroup -Location westus -Debug
這會傳回許多值,包括下列值︰
DEBUG: ============================ HTTP RESPONSE ============================
Status Code:
Created
Headers:
Pragma : no-cache
x-ms-ratelimit-remaining-subscription-writes: 1199
在 Azure CLI 中,您可以使用更詳細的選項擷取標頭值。
az group list --verbose --debug
這會傳回許多值,包括下列值︰
msrest.http_logger : Response status: 200
msrest.http_logger : Response headers:
msrest.http_logger : 'Cache-Control': 'no-cache'
msrest.http_logger : 'Pragma': 'no-cache'
msrest.http_logger : 'Content-Type': 'application/json; charset=utf-8'
msrest.http_logger : 'Content-Encoding': 'gzip'
msrest.http_logger : 'Expires': '-1'
msrest.http_logger : 'Vary': 'Accept-Encoding'
msrest.http_logger : 'x-ms-ratelimit-remaining-subscription-reads': '11998'
若要取得寫入限制,請使用寫入作業:
az group create -n myresourcegroup --location westus --verbose --debug
這會傳回許多值,包括下列值︰
msrest.http_logger : Response status: 201
msrest.http_logger : Response headers:
msrest.http_logger : 'Cache-Control': 'no-cache'
msrest.http_logger : 'Pragma': 'no-cache'
msrest.http_logger : 'Content-Length': '163'
msrest.http_logger : 'Content-Type': 'application/json; charset=utf-8'
msrest.http_logger : 'Expires': '-1'
msrest.http_logger : 'x-ms-ratelimit-remaining-subscription-writes': '1199'
下一步
- 如需有關限制和配額的詳細資訊,請參閱 Azure 訂用帳戶和服務限制、配額及條件約束。
- 若要了解如何處理非同步 REST 要求,請參閱追蹤非同步 Azure 作業 (英文)。