Попытка загрузить несколько элементов в cosmos db

#node.js #azure-cosmosdb #azure-cosmosdb-sqlapi

#node.js #azure-cosmosdb #azure-cosmosdb-sqlapi

Вопрос:

Я пытаюсь прочитать файл построчно, после достижения 500 строк я создаю клиент-контейнер cosmos db и загружаю данные. Таким образом, я разделяю соединение для каждых 500 строк. Вот мой код :

 lineReader.eachLine(pathToFile, (line, last) => {
            lineCount  = 1
            let insertItem = JSON.parse(line)
            linesList.push(insertItem)
            if (lineCount % 500 === 0) {
                //create copy of lineslist and empty the actual list
                let tempList = [...linesList]
                linesList = []
        
                getContainer('dummy2', 'type').then(container => {
                    tempList.map((lineToBeInserted, pos) => {
                        container.items.create(lineToBeInserted).then(dbItem => {
                            if (last) {
                                res.end('rn written all data to db')
                            } else {
                                res.write('writtem to db')
                            }
                        })
  

Вот мой метод getContainer в конфигурации :

 async function getContainer(name, partitionKey) {

  partitionKey = "/"   partitionKey

  let pk = getConfig(name, partitionKey).partitionKey

  return _client
    .database(_databaseId)
    .containers.createIfNotExists({
      id: name,
      pk
    }, {
      offerThroughput: 5000
    }).then(container => {
      return _db.container(container.container.id)
    }).catch(err => {
      console.log(err)
    })

}
  

Но я получаю ошибку ETIMEDOUT в методе .create() для создания элемента:

 FetchError: request to https://brand-consumer-analytics-eastasia.documents.azure.com:443/dbs/quilt/colls/dummy2/docs failed, reason: connect ETIMEDOUT 23.102.239.134:443
    at ClientRequest.<anonymous> (D:Polynomial ProjectsCompare Blob with dbnode_modulesnode-fetchlibindex.js:1461:11)    
    at ClientRequest.emit (events.js:315:20)
    at TLSSocket.socketErrorListener (_http_client.js:426:9)
    at TLSSocket.emit (events.js:315:20)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  type: 'system',
  errno: 'ETIMEDOUT',
  code: 'ETIMEDOUT',
  headers: {
    'x-ms-throttle-retry-count': 0,
    'x-ms-throttle-retry-wait-time-ms': 0
  }
}
  

Не удалось получить причину этой ошибки. Когда я пропускаю проверку строки и создаю контейнерный клиент для каждой записи, ошибка не отображается.

Комментарии:

1. Вы пытались уменьшить количество строк, например, 400, 300, 200 ..? Я подозреваю, что наличие 500 элементов может быть чрезмерным для сети. Просматривая трассировку стека, это выглядит как ошибка сетевого стека узла, а не со стороны CosmosDB.

2. Я в замешательстве. Вы создаете новый контейнер для каждых 500 элементов, а затем вставляете данные в новый контейнер?

3. Привет @krishg, да, я пытался уменьшить количество, но это не сработало. Есть ли какой-либо способ увеличить время ожидания для cosmos db?

4. Как lineToBeInserted выглядит образец? Документ в формате json?

5. Да, lineToBeInserted — это документ json.