要求率很高

时间:2015-08-26 07:26:17

标签: node.js azure asynchronous azure-cosmosdb

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

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

正文:' {"代码":" 429","消息":"消息:{\"错误\":[\"请求率很大\"]} \ r \ nActivityId:1fecee65-0bb7-4991-a984-292c0d06693d,请求URI:/ apps / cce94097-e5b2-42ab- 9232-6abd12f53528 /服务/ 70926718-b021-45ee-ba2f-46c4669d952e /分区/ dd46d670-ab6f-4dca-BBBB-937647b03d97 /复制/ 130845018837894542p"}' }

意味着DocumentDb每秒无法处理1000多个请求? 总而言之,我对NoSQL技术给人留下了不好的印象..它是DocumentDB的缺失吗?

1 个答案:

答案 0 :(得分:4)

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

我在我的documentdb-utils node.js package中写了逻辑来处理这个问题。您可以尝试使用documentdb-utils,也可以自己复制。这是一个片断的例子。

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函数调用