У меня есть небольшое задание, которое выполняется каждую минуту и выполняет сканирование в таблице, содержащей около 3000 строк:
async execute (dialStatus) {
if (!process.env.DIAL_TABLE) {
throw new Error('Dial table not found')
}
const params = {
TableName: process.env.DIAL_TABLE,
FilterExpression: '#name = :name AND #dial_status = :dial_status AND #expires_on > :expires_on',
ExpressionAttributeNames: {
'#name': 'name',
'#dial_status': 'dial_status',
'#expires_on': 'expires_on'
},
ExpressionAttributeValues: {
':name': { 'S': this.name },
':dial_status': { 'S': dialStatus ? dialStatus : 'received' },
':expires_on': { 'N': Math.floor(moment().valueOf() / 1000).toString() }
}
}
console.log('params', params)
const dynamodb = new AWS.DynamoDB()
const data = await dynamodb.scan(params).promise()
return this._buildObject(data)
}
Я сталкиваюсь с проблемой единиц чтения и тайм-аутов на DynamodB.Сейчас я использую 50 единиц чтения, и это становится дороже по сравнению с RDS.
Имена атрибутов, используемые в функции сканирования, не являются моим первичным ключом: name
является вторичным индексом, а dial_status
является обычным атрибутом в моем json, но каждая строка имеет этот атрибут.
Это задание выполняется каждую минуту для списка параметров (т. е. если у меня есть 10 параметров, я выполню это scan
10 раз вминуты).
Моя таблица имеет следующую схему:
- телефон (PK Hash)
- конфигурация: JSON в формате String;
- dial_status String;
- expires_on: номер TTL;
- name: String
- origin: String;
Задание должно получать все элементы на основеname и dial_status и количество элементов ограничено 15 элементами в каждом исполнении (каждую минуту).Для каждого элемента он должен быть поставлен в очередь для обработки SQS.
Мне действительно нужно уменьшить эти единицы чтения, но я не уверен, как оптимизировать эту функцию.Я читал о том, как уменьшить размер страницы или избежать сканирования.Каковы мои альтернативы, чтобы избежать scan
, если у меня нет первичного ключа и я хочу вернуть группу строк?
Любая идея о том, как исправить этот код, будет вызываться примерно 10-15 раз каждыйминут