429 Client Error: TooManyRequests for url

429 Client Error: TooManyRequests for url

我有一个脚本可以在一定时间内执行摄取语句。简化的方式如下所示:

import time
from azure.kusto.data import KustoClient, KustoConnectionStringBuilder, ClientRequestProperties


cluster = "https://<adxname>.centralus.kusto.windows.net"
client_id = "<sp_guid>"
client_secret = "<sp_secret>"
authority_id = "<tenant_guid>"
db = "db-name"

kcsb = KustoConnectionStringBuilder.with_aad_application_key_authentication(
    cluster, client_id, client_secret, authority_id)
client = KustoClient(kcsb)

query = """
.append my_table <|
another_table | where ... | summarize ... | project ...
"""

while True:
    client.execute(db, query)
    time.sleep(30.0)

因此它每 30 秒执行一次小查询。查询只需几毫秒即可完成。库版本:azure-kusto-data==3.1.0.

它在一段时间内工作正常,但一段时间后它开始失败并出现以下错误:

requests.exceptions.HTTPError: 429 Client Error: TooManyRequests for url: https://adxname.centralus.kusto.windows.net/v1/rest/mgmt

azure.kusto.data.exceptions.KustoApiError: The control command was aborted due to throttling. Retrying after some backoff might succeed. CommandType: 'TableAppend', Capacity: 1, Origin: 'CapacityPolicy/Ingestion'.

查看错误中提到的 CapacityPolicy/Ingestion,我看不出它有什么相关性。此策略保留为默认值:

.show cluster policy capacity

"Policy": {
  "IngestionCapacity": {
    "ClusterMaximumConcurrentOperations": 512,
    "CoreUtilizationCoefficient": 0.75
  },
  ...
}

我不太明白它与并发操作或核心利用率有什么关系,因为摄取速度很快而且很少执行。

如何解决问题?

根据错误消息,您的集群的摄取容量为 1。这可能表明您正在使用具有 2 个核心的单个节点的开发 SKU。

使用这样的设置,在给定时间只能进行一次摄取操作 运行。任何额外的并发摄取都将受到限制。

您可以对摄取到集群中的客户端实施更严格的控制,以便不超过一个摄取命令同时尝试 运行,并且调用代码可以从节流错误中恢复;或扩展集群 up/out - 通过添加更多 nodes/cores 您将增加摄取容量。

您还可以使用 .show commands

验证 who/what else 是否正在摄取您的集群

假设您对数据库具有监控或管理员权限,您可以运行以下内容以查看任何给定时间段内的摄取activity(确保您在“在”子句中),例如:

.show commands 
| where StartedOn > ago(1h)
| where CommandType in ("DataIngestPull", "TableAppend", "TableSetOrReplace", "TableSetOrAppend")
| summarize count() by CommandType

附带说明,对于此类操作,您应该考虑使用 materialized views