Cosmos DB Mongo API如何管理"请求率很大"条件

时间:2018-01-02 16:57:24

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

我有以下代码..

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

如果我使用大量文档运行它(不出意外)

func FindProspects(categories *string, cities *string, hasEmail *bool, hasContactperson *bool, limit int64, offset int64) []*gModels.Prospect {
    var prospects []*gModels.Prospect

    query := env.DB().Table("prospects").Select("prospects.id, prospects.name")

    if categories != nil {
        query = query.Joins("JOIN prospect_categories ON prospect_categories.prospect_id = prospects.id").Where("prospect_categories.category_name IN (?)", strings.Split(*categories, ","))
    }

    if cities != nil {
        query = query.Where("prospects.city IN (?)", strings.Split(*cities, ","))
    }

    if hasEmail != nil && *hasEmail == true {
        query = query.Where("prospects.id IN (SELECT emails.prospect_id FROM emails WHERE emails.prospect_id = prospects.id)")
    }

    if hasContactperson != nil && *hasContactperson == true {
        query = query.Where("prospects.id IN (SELECT contact_people.prospect_id FROM contact_people WHERE contact_people.prospect_id = prospects.id)")
    }

    query = query.Order("prospects.name ASC")

    query.Limit(int(limit)).Offset(int(offset)).Find(&prospects)

    return prospects
}

看来我正在处理的740条记录中有一些(约165条)已被加载。所有这些似乎都被分配了&#39; _id&#39;属性。

有没有人知道如何处理这个问题(或者至少说明插入了哪些记录以及哪些记录不是进程)......

1 个答案:

答案 0 :(得分:-1)

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

  

超出规定的请求单位的应用程序   收集将被限制,直到费率低于保留   水平。当油门发生时,后端将抢先结束   请求16500错误代码 - 请求太多。默认情况下,API   对于MongoDB,在返回之前会自动重试最多10次   请求错误代码太多。

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

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

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

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

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

  4. 您可以参考此article

    希望它对你有所帮助。

    更新答案:

    您的文档看起来不是唯一可识别的。所以我认为由Cosmos DB自动生成的“_id”属性无法确定插入了哪些文档以及哪些文档尚未插入。

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

    考虑到费用,请参阅此document以设置相应的RU。

    或者您可以通过Cosmos DB Emulator.

    在本地测试批量导入操作