DocumentDB return "Request rate is large",在 azure 上解析

DocumentDB return "Request rate is large", parse on azure

我在 Azure 上运行解析(托管 Azure 服务上的解析服务器), 我没有将 DocumentDB 作为数据库包含在内,并且对每秒请求数有限制。 一些解析云功能很大并且请求速度太高(即使对于 S3 层)所以我收到此错误(使用 Visual Studio Team Services(是 Visual Studio 在线)和流日志) .

    error: Uncaught internal server error. { [MongoError: Message: {"Errors":["Request rate is large"]}

ActivityId: a4f1e8eb-0000-0000-0000-000000000000, Request URI: rntbd://10.100.99.69:14000/apps/f8a35ed9-3dea-410f-a89a-28650ff41381/services/2d8e5320-89e6-4750-a06f-174c12013c69/partitions/53e8a085-9fed-4880-bd90-f6191765f625/replicas/131091039101528218s]
  name: 'MongoError',
  message: 'Message: {"Errors":["Request rate is large"]}\r\nActivityId: a4f1e8eb-0000-0000-0000-000000000000, Request URI: rntbd://10.100.99.69:14000/apps/f8a35ed9-3dea-410f-a89a-28650ff41381/services/2d8e5320-89e6-4750-a06f-174c12013c69/partitions/53e8a085-9fed-4880-bd90-f6191765f625/replicas/131091039101528218s' } MongoError: Message: {"Errors":["Request rate is large"]}

ActivityId: a4f1e8eb-0000-0000-0000-000000000000, Request URI: rntbd://10.100.99.69:14000/apps/f8a35ed9-3dea-410f-a89a-28650ff41381/services/2d8e5320-89e6-4750-a06f-174c12013c69/partitions/53e8a085-9fed-4880-bd90-f6191765f625/replicas/131091039101528218s
    at D:\home\site\wwwroot\node_modules\mongodb-core\lib\cursor.js:673:34
    at handleCallback (D:\home\site\wwwroot\node_modules\mongodb-core\lib\cursor.js:159:5)
    at setCursorDeadAndNotified (D:\home\site\wwwroot\node_modules\mongodb-core\lib\cursor.js:501:3)
    at nextFunction (D:\home\site\wwwroot\node_modules\mongodb-core\lib\cursor.js:672:14)
    at D:\home\site\wwwroot\node_modules\mongodb-core\lib\cursor.js:585:7
    at queryCallback (D:\home\site\wwwroot\node_modules\mongodb-core\lib\cursor.js:241:5)
    at Callbacks.emit (D:\home\site\wwwroot\node_modules\mongodb-core\lib\topologies\server.js:119:3)
    at null.messageHandler (D:\home\site\wwwroot\node_modules\mongodb-core\lib\topologies\server.js:397:23)
    at TLSSocket.<anonymous> (D:\home\site\wwwroot\node_modules\mongodb-core\lib\connection\connection.js:302:22)
    at emitOne (events.js:77:13)

如何处理这个错误?

TL;DR;

  1. 根据新定价方案将旧 S3 collection 升级为新单机 collection。这最多可支持 10K RU(从 2500 RU 开始)
  2. 删除旧的 S3 collection 并创建一个新的分区 collection。将需要在解析中支持分区 collection。
  3. 根据 x-ms-retry-after-ms 响应 header 实施退避策略。

长答案:

每个对 DocumentDB 的请求 returns 一个 HTTP header 以及该操作的请求费用。请求单位的数量按 collection 配置。据我了解,您有 1 个 collection 大小为 S3,因此此 collection 每秒只能处理 2500 个请求单元。

DocumentDB 通过添加多个 collection 进行扩展。对于使用 S1 -> S3 的旧配置,您必须手动执行此操作,即您必须使用一致性哈希、地图或也许日期等算法在 collections 上分发数据。通过 DocumentDB 中的新定价,您可以使用分区 collections,通过定义分区键,DocumentDB 将为您分片数据。如果您发现持续出现 RequestRateTooLarge 错误率,我建议扩展分区。但是,您需要调查 Parse 是否支持分块 collections。

当您收到 HTTP 429 RequestRateTooLarge 时,还有一个名为 x-ms-retry-after-ms 的 header :### 其中 ### 表示重试操作之前等待的毫秒数。您可以做的是实施重试操作的 back-off 策略。请注意,如果您在重试期间有客户端挂在服务器上,您可能会建立请求 queues 并阻塞服务器。我建议添加一个 Queue 来处理这种突发情况。对于短暂的突发请求,这是一种无需扩展 collection 即可处理的好方法。

我使用 Mlab 作为外部 mongoDB 数据库并在 Azure 中配置解析应用程序以使用它而不是 documentDB。

我不得不愿意为 "performance" 增加付出这么多。