2015-08-26 2 views
3

Im, использующий Azure documentdb и доступ к нему через мой node.js на экспресс-сервере, когда я запрашиваю в цикле, с низким объемом в несколько сотен нет проблем. Но когда запрос в петле немного большим объемом, скажем, около тысячи плюсБольшая заявка на запрос

Я получаю частичные результаты (противоречива, каждый раз, когда я запускаю результирующие значения не совпадают. Может быть, из-за асинхронной природы Node.js) после нескольких результатов он сбой с этой ошибкой

тело: '{"code": "429", "message": "Сообщение: {\" Errors \ ": [\" Request rate is large \ "]} \ r \ nActivityId : 1fecee65-0bb7-4991-a984-292c0d06693d, Request URI:/apps/cce94097-e5b2-42ab-9232-6abd12f53528/services/70926718-b021-45ee-ba2f-46c4669d952e/разделы/dd46d670-ab6f-4dca-bbbb-937647b03d97/replicas/130845018837894542p "} '}

Mea ning DocumentDb не обрабатывает 1000 запросов в секунду? Все вместе давая мне плохое впечатление о методах NoSQL .. это короткое прибытие DocumentDB?

+0

Можете ли вы проверить, какой уровень цен вы установили для своей коллекции? Является ли он «стандартным S2» (1000 единиц запроса) или «стандартным S3» (2500 единиц запроса)? –

+0

Gaurav, это то, что видят в моих свойствах DocumentDB лезвие, STATUS Интернет СЧЕТ TIER Стандартный РАСПОЛОЖЕНИЕ Юго-Восточной Азии – Shreyz

+0

Любой путь я мог бы перейти на S3 сейчас? – Shreyz

ответ

4

Как предлагает Gaurav, вы можете избежать проблемы, столкнувшись с ценовым уровнем, но даже если вы перейдете на самый высокий уровень, вы сможете обрабатывать 429 ошибок. Когда вы получите ошибку 429, ответ будет включать заголовок «x-ms-retry-after-ms». Это будет содержать число, представляющее число миллисекунд, которое вы должны дождаться, прежде чем повторять запрос, вызвавший ошибку.

Я написал логику для обработки этого в моем 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.

+3

Я просто перечитал ваш вопрос и подумал еще. Способ DocumentDB обрабатывает масштабирование через количество Коллекций. Таким образом, если вам нужно больше 2500 RU/сек, вы должны разбить свои данные и использовать вторую коллекцию ... даже если вы не находились рядом с хранилищем одной коллекции. С другой стороны, если ваше устойчивое состояние значительно ниже 2500 RU/сек, но у вас есть редкие всплески, то подход 429, описанный выше, должен быть прекрасным. –

Смежные вопросы