请求率大

Shr*_*eyz 4 asynchronous azure node.js azure-cosmosdb

我使用 Azure documentdb 并通过我在 Express 服务器上的 node.js 访问它,当我循环查询时,几百的低容量没有问题。但是当循环查询体积略大时,说大约一千多

我得到部分结果(不一致,每次我运行结果值都不相同。可能是因为 Node.js 的异步性质)在几个结果之后它会因此错误而崩溃

body: '{"code":"429","message":"Message: {\"Errors\":[\"Request rate is large\"]}\r\nActivityId: 1fecee65-0bb7-4991-a984- 292c0d06693d,请求URI:/应用/ cce94097-e5b2-42ab-9232-6abd12f53528 /服务/ 70926718-b021-45ee-ba2f-46c4669d952e /分区/ dd46d670-ab6f-4dca-BBBB-937647b03d97 /复制/ 130845018837894542p“}”}

含义 DocumentDb 每秒无法处理 1000 多个请求?总而言之,我对 NoSQL 技术的印象很差……这是 DocumentDB 的不足之处吗?

Lar*_*one 5

正如 Gaurav 所建议的,您可以通过提高定价层来避免该问题,但即使您转到最高层,您也应该能够处理 429 错误。当您收到 429 错误时,响应将包含一个“x-ms-retry-after-ms”标头。这将包含一个数字,表示在重试导致错误的请求之前应该等待的毫秒数。

我在我的documentdb-utils node.js 包中编写了处理这个的逻辑。您可以尝试使用 documentdb-utils,也可以自己复制它。这是一个 snipit 示例。

createDocument = function() {
   client.createDocument(colLink, document, function(err, response, header) {
        if (err != null) {
            if (err.code === 429) {
                var retryAfterHeader = header['x-ms-retry-after-ms'] || 1;
                var retryAfter = Number(retryAfterHeader);
                return setTimeout(toRetryIf429, retryAfter);
            } else {
                throw new Error(JSON.stringify(err));
            }
        } else {
            log('document saved successfully');
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

注意,在上面的例子中document是在createDocument 的范围内。这使得重试逻辑更简单一些,但是如果您不喜欢使用范围广泛的变量,那么您可以传入documentcreateDocument ,然后将其传递到setTimeout调用中的 lambda 函数中。

  • 我刚刚重读了你的问题,并有一个想法。DocumentDB 处理缩放的方式是通过集合的数量。因此,如果您需要超过 2500 RU/秒,您应该对您的数据进行分区并使用第二个集合……即使您的存储容量远不及一个集合的存储容量。另一方面,如果您的稳定状态远低于 2500 RU/秒,但您很少会突然超过该值,那么上面的 429 处理方法应该没问题。 (3认同)