#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.