gpt4 book ai didi

Azure Cosmos DB - 删除项目时出现 'Request rate is large. More Request Units may be needed' 错误

转载 作者:行者123 更新时间:2023-12-02 23:01:30 27 4
gpt4 key购买 nike

我正在使用下面的存储过程从 cosmos db 集合中删除项目。

function bulkDeleteStoredProcedure(query) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var response = getContext().getResponse();
var responseBody = {
deleted: 0,
continuation: true
};

// Validate input.
if (!query) throw new Error("The query is undefined or null.");

tryQueryAndDelete();

// Recursively runs the query w/ support for continuation tokens.
// Calls tryDelete(documents) as soon as the query returns documents.
function tryQueryAndDelete(continuation) {
var requestOptions = {continuation: continuation};

var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, function (err, retrievedDocs, responseOptions) {
if (err) throw err;

if (retrievedDocs.length > 0) {
// Begin deleting documents as soon as documents are returned form the query results.
// tryDelete() resumes querying after deleting; no need to page through continuation tokens.
// - this is to prioritize writes over reads given timeout constraints.
tryDelete(retrievedDocs);
} else if (responseOptions.continuation) {
// Else if the query came back empty, but with a continuation token; repeat the query w/ the token.
tryQueryAndDelete(responseOptions.continuation);
} else {
// Else if there are no more documents and no continuation token - we are finished deleting documents.
responseBody.continuation = false;
response.setBody(responseBody);
}
});

// If we hit execution bounds - return continuation: true.
if (!isAccepted) {
response.setBody(responseBody);
}
}

// Recursively deletes documents passed in as an array argument.
// Attempts to query for more on empty array.
function tryDelete(documents) {
if (documents.length > 0) {
// Delete the first document in the array.
var isAccepted = collection.deleteDocument(documents[0]._self, {}, function (err, responseOptions) {
if (err) throw err;

responseBody.deleted++;
documents.shift();
// Delete the next document in the array.
tryDelete(documents);
});

// If we hit execution bounds - return continuation: true.
if (!isAccepted) {
response.setBody(responseBody);
}
} else {
// If the document array is empty, query for more documents.
tryQueryAndDelete();
}
}
}

在执行此存储过程时,我收到以下错误:

Failed to execute stored procedure BulkDelete for container Notifications: {"code":429,"body":{"code":"429","message":"Message: {\"Errors\":[\"Request rate is large. More Request Units may be needed, so no changes were made. Please retry this request later. Learn more: http://aka.ms/cosmosdb-error-429\"]}\r\nActivityId: cc616784-03ee-4b10-9481-d62c26e496e4, Request URI: /apps/2268c937-d7b4-449e-9d76-a2d50d5d3546/services/df84607d-8553-4938-aa0d-913563078a93/partitions/b37017a9-ab2c-4a88-bb51-0ae729299a7e/replicas/132314907336368334p/, RequestStats: \r\nRequestStartTime: 2020-05-20T07:55:16.8899325Z, RequestEndTime: 2020-05-20T07:55:17.5299234Z, Number of regions attempted:1\r\nResponseTime: 2020-05-20T07:55:17.5299234Z, StoreResult: StorePhysicalAddress: rntbd://cdb-ms-prod-northeurope1-fd25.documents.azure.com:14307/apps/2268c937-d7b4-449e-9d76-a2d50d5d3546/services/df84607d-8553-4938-aa0d-913563078a93/partitions/b37017a9-ab2c-4a88-bb51-0ae729299a7e/replicas/132314907336368334p/, LSN: 400340, GlobalCommittedLsn: 400339, PartitionKeyRangeId: , IsValid: True, StatusCode: 429, SubStatusCode: 3200, RequestCharge: 0.38, ItemLSN: -1, SessionToken: , UsingLocalLSN: False, TransportException: null, ResourceType: StoredProcedure, OperationType: ExecuteJavaScript\r\n, SDK: Microsoft.Azure.Documents.Common/2.11.0"},"headers":{"access-control-allow-credentials":"true","access-control-allow-origin":"https://cosmos.azure.com","content-type":"application/json","lsn":"400340","strict-transport-security":"max-age=31536000","x-ms-activity-id":"cc616784-03ee-4b10-9481-d62c26e496e4","x-ms-cosmos-llsn":"400340","x-ms-cosmos-quorum-acked-llsn":"400340","x-ms-current-replica-set-size":"4","x-ms-current-write-quorum":"3","x-ms-gatewayversion":"version=2.11.0","x-ms-global-committed-lsn":"400339","x-ms-number-of-read-regions":"1","x-ms-quorum-acked-lsn":"400340","x-ms-request-charge":"0.38","x-ms-retry-after-ms":"8538","x-ms-schemaversion":"1.9","x-ms-serviceversion":"version=2.11.0.0","x-ms-substatus":"3200","x-ms-transport-request-id":"120","x-ms-xp-role":"1","x-ms-throttle-retry-count":5,"x-ms-throttle-retry-wait-time-ms":32087},"activityId":"cc616784-03ee-4b10-9481-d62c26e496e4","substatus":3200,"retryAfterInMs":8538}

如何解决这个问题?存储过程有问题吗?

最佳答案

当当前聚合 RU + 查询的 RU 将超过您设置的阈值时,CosmosDB 将返回 429。例如,如果您的阈值是 400,到目前为止您已经使用了 380 个 RU,而下一个查询需要 22 个 RU 才能完成,cosmos 将拒绝该查询,代码为 429。如果下一个查询只需要 3 个 RU,它将成功。 1秒后,累计RU值重置为零,22 RU查询将成功。

如果您收到 429,您还将收到一个“x-ms-retry-after-ms” header ,其中包含一个数字。您应该等待该毫秒数,然后再重试查询。

https://learn.microsoft.com/en-us/rest/api/cosmos-db/common-cosmosdb-rest-response-headers

或者,您可以通过提高阈值来避免 429(这也会增加服务成本)。因此,您必须决定是重试还是提高阈值。这取决于您的应用程序的性质。

RU 或资源单位由 CosmosDB 服务根据服务需要完成的工作量进行计算。它是索引有多大、传输的数据量、使用的 CPU、磁盘、内存数量等的组合。RU 收费是 Cosmos 了解您将要运行的工作负载和根据需要进行必要的后端更改。 Cosmos 的每秒成本基于您的 RU 阈值设置。它还允许 Cosmos 在后端进行必要的更改,以满足您的性能需求。如果您在世界各地的不同地区进行阅读和写作,RU 计算会变得更加复杂。

您可以通过重组索引中的数据来降低查询的 RU 成本。如果您分散到多个分区,查询将并行运行,从而在更短的时间内完成更多工作。如果减少或增加在网络、内存和 CPU 组件上移动的千字节数,也会更改 RU。

关于Azure Cosmos DB - 删除项目时出现 'Request rate is large. More Request Units may be needed' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61908022/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com