我使用 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 的不足之处吗?

最佳答案

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

我在 documentdb-utils node.js package 中编写了逻辑来处理这个问题。您可以尝试使用 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');
        }
    });
};

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

关于node.js - 请求率大,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32220404/

10-13 09:34