【问题标题】:Cosmos DB Mongo API How to manage "Request Rate is Large" conditionCosmos DB Mongo API 如何管理“请求率很大”的情况
【发布时间】:2018-06-12 09:23:03
【问题描述】:

我有以下代码..

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)
  }

}

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

{ 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' }

我正在处理的 740 条记录中的一些(大约 165 条)似乎已加载。他们似乎都被分配了“_id”属性。

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

【问题讨论】:

    标签: javascript node.js mongodb azure azure-cosmosdb


    【解决方案1】:

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

    超过规定的请求单位的应用程序 收集将被限制,直到速率低于保留 等级。当一个节流发生时,后端将抢先结束 带有 16500 错误代码的请求 - 请求过多。默认情况下,API for MongoDB 在返回之前会自动重试 10 次 Too Many Requests 错误代码。

    您可以从official document 找到更多说明。

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

    1. 批量导入数据以降低吞吐量。

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

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

    你可以参考这个article

    希望对你有帮助。


    更新答案:

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

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

    考虑到成本,请参考这个document设置合适的RU。

    或者您可以通过Cosmos DB Emulator.在本地测试批量导入操作

    【讨论】:

    • 杰伊。感谢您的回复。我试图弄清楚如何以优雅的方式处理异常并重试未插入文档的操作。鉴于异常中的信息,这似乎几乎是不可能的。所有文档都被分配了“_id”属性(由 mongo 客户端软件),肯定有比测试每个分配的 id 是否对应于 COSMOS 表中的条目更好的解决方案...... .
    • 我不知道所有文件都被赋予了“_id”属性是什么意思。这些文档是否已插入数据库?
    • 似乎mongo客户端在开始插入之前为数组中的每个文档分配了一个_id属性。所以,回答你的第二个问题,当抛出错误时,所有文档都被分配了一个 _id 属性,但只有其中一些被插入到数据库中。因此我的问题是,我需要确定(最好是从异常中)哪些文档已插入,哪些未插入。我不能使用 _id 属性的优先级,因为在尝试插入操作之前,这似乎已被注入到所有文档中
    • Jay.. AFAIK _id 是由 Mongo Node API 添加的,而不是 Cosmos。考虑到有足够大的文档集进行批量插入,我迟早会增加多少我的 RU 并不重要,我会遇到这个错误并且需要能够以优雅的方式从中恢复。对于多用户系统,清除数据库并重试不是一种选择。
    • 这是没有答案的。 CosmosDB 应该返回失败的操作,或者底层 API 应该尽可能重试 insertMany
    猜你喜欢
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多