Cosmos DB Mongo API如何管理“请求率过高”条件

mar*_*ake 7 javascript azure mongodb node.js azure-cosmosdb

我有以下代码。

async function bulkInsert(db, collectionName, documents) {
  try {
    const cosmosResults = await db.collection(collectionName).insertMany(documents);
    console.log(cosmosResults);
    return cosmosResults
  } catch (e) {
    console.log(e)
  }

}
Run Code Online (Sandbox Code Playgroud)

如果我使用大量文档来运行它,我会得到(并非意外)

{ MongoError: Message: {"Errors":["Request rate is large"]}
  ActivityId: b3c83c38-0000-0000-0000-000000000000, 
  Request URI: /apps/DocDbApp/services/DocDbServer24/partitions/a4cb4964-38c8-11e6-8106-8cdcd42c33be/replicas/1p/, 
  RequestStats: , SDK: Microsoft.Azure.Documents.Common/1.19.102.5
    at G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\pool.js:596:61
at authenticateStragglers (G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\pool.js:514:16)
at Connection.messageHandler (G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\pool.js:550:5)
at emitMessageHandler (G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\connection.js:309:10)
at TLSSocket.<anonymous> (G:\Node-8\NodeExample\node_modules\oracle-movie-ticket-demo\node_modules\mongodb-core\lib\connection\connection.js:452:17)
at emitOne (events.js:116:13)
at TLSSocket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
at TLSSocket.Readable.push (_stream_readable.js:208:10)
name: 'MongoError',
message: 'Message: {"Errors":["Request rate is large"]}\r\nActivityId: b3c83c38-0000-0000-0000-000000000000, 
Request URI: /apps/DocDbApp/services/DocDbServer24/partitions/a4cb4964-38c8-11e6-8106-8cdcd42c33be/replicas/1p/, RequestStats: , SDK: Microsoft.Azure.Documents.Common/1.19.102.5',
_t: 'OKMongoResponse',
ok: 0,
code: 16500,
errmsg: 'Message: {"Errors":["Request rate is large"]}\r\nActivityId:      b3c83c38-0000-0000-0000-000000000000, 
Request URI: /apps/DocDbApp/services/DocDbServer24/partitions/a4cb4964-38c8-11e6-8106-8cdcd42c33be/replicas/1p/, 
RequestStats: , 
SDK: Microsoft.Azure.Documents.Common/1.19.102.5',
 '$err': 'Message: {"Errors":["Request rate is large"]}\r\nActivityId: b3c83c38-0000-0000-0000-000000000000, 
 Request   URI: /apps/DocDbApp/services/DocDbServer24/partitions/a4cb4964-38c8-11e6-8106-8cdcd42c33be/replicas/1p/, RequestStats: , 
SDK: Microsoft.Azure.Documents.Common/1.19.102.5' }
Run Code Online (Sandbox Code Playgroud)

看来我正在处理的740条记录中的某些(大约165条)已装入。它们似乎都被分配了“ _id”属性。

有谁知道如何处理这个问题(或至少说出插入了哪些记录,哪些不是进程)...

Jay*_*ong -1

cosmosdb 的请求需要消耗 RU。显然,您的插入请求超出了 RU 吞吐量,并出现错误代码 16500。

超过集合的预配置请求单位的应用程序将受到限制,直到速率降至保留水平以下。当发生限制时,后端将抢先结束请求,并显示 16500 错误代码 - 请求过多。默认情况下,API for MongoDB 将自动重试最多 10 次,然后返回 Too Many Requests 错误代码。

您可以从官方文档中找到更多说明。

您可以按照以下方式尝试解决该问题:

  1. 批量导入数据以减少吞吐量。

  2. 在您的应用程序中添加您自己的重试逻辑。

  3. 增加集合的预留吞吐量。当然,这会增加你的成本。

你可以参考这篇文章

希望对您有帮助。


更新答案:

您的文档似乎无法唯一识别。所以我认为Cosmos DB自动生成的“_id”属性无法确定哪些文档已插入,哪些文档尚未插入。

我建议您增加吞吐量设置,清空数据库,然后批量导入数据。

考虑到成本,请参考本文档设置合适的RU。

或者,您可以通过Cosmos DB 模拟器在本地测试批量导入操作。

  • 这是一个没有答案的问题。CosmosDB 应返回失败的操作,或者底层 API 应尽可能重试,就像使用 insertMany 一样 (4认同)