Rak*_*mar 4 azure azure-cosmosdb azure-cosmosdb-sqlapi
我正在使用下面的存储过程从 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
执行此存储过程时,我收到以下错误:
无法执行容器通知的存储过程 BulkDelete: {"code":429,"body":{"code":"429","message":"消息: {\"Errors\":[\"请求率为大的。可能需要更多请求单元,因此未进行任何更改。请稍后重试此请求。了解更多信息:http://aka.ms/cosmosdb-error-429 \"]}\r\nActivityId:cc616784-03ee-4b10-9481-d62c26e496e4,请求 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,请求结束时间: 2020-05-20T07:55:17.5299234Z,尝试的区域数:1\r\n响应时间: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-0ae 729299a7e/副本/132314907336368334p/, LSN:400340,GlobalCommitedLsn: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":"版本=2.11.0 ","x-ms-global-comfilled-lsn":"400339","x-ms-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" ,“子状态”:3200,“retryAfterInMs”:8538}
我该如何解决这个问题?存储过程有问题吗?
nmi*_*shr 10
当当前聚合 RU + 查询的 RU 将超过您设置的阈值时,CosmosDB 将返回 429。例如,如果您的阈值是 400,到目前为止您已经使用了 380 RU,而下一个查询需要 22 RU 才能完成,cosmos 将拒绝该查询,代码为 429。如果下一个查询只需要 3 RU,它将成功。1 秒后,累计 RU 值重置为零,22 RU 查询将成功。
如果您收到 429,您还将收到一个“x-ms-retry-after-ms”标头,其中包含一个数字。在重试查询之前,您应该等待该毫秒数。
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。
| 归档时间: |
|
| 查看次数: |
14987 次 |
| 最近记录: |