У меня есть DynamoDB, работающий в облаке AWS, и я заполняю его данными на регулярных (запланированных) базах. В принципе, один раз в час я получаю файл, который необходимо обработать, и результаты должны быть сохранены в базе данных.DynamoDB - очень медленные операции записи
Я использую следующий класс для обработки соединения DB и выполнять партию пишет:
public class DynamoDBService {
private final AmazonDynamoDB amazonDynamoDB = new AmazonDynamoDBClient();
private final DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDB);
@Value("${aws_region}")
private String region;
@PostConstruct
public void init() {
log.info("Region: {}", region);
amazonDynamoDB.setRegion(RegionUtils.getRegion(region));
}
/**
*
* @param records
*/
public void saveRecord(final Collection<Record> records) {
log.info("Saving records...");
// create table if necessary here
List<Record> recordsToSave = new ArrayList<Record>(100);
for (Record record : records) {
recordsToSave.add(record);
}
// save the records
List<FailedBatch> failedBatch = mapper.batchWrite(recordsToSave, new ArrayList<Record>());
// process failed writes here
log.info("All records have been saved.");
}
}
Проблема заключается в том, что пишет мучительно медленно. Я прочитал документацию и увеличил пропускную способность (так что теперь она должна поддерживать более 300000 операций записи/час), но для обработки одного списка требуется приблизительно 15 минут. 8000 записей.
Я читал, что оптимальное количество записей в одной пакетной операции составляет 25 и размер одной записи ниже 1кб. Я тестировал его как на своем локальном компьютере (который, как я знаю, будет медленнее из-за трафика), так и в рабочей среде AWS, но результаты были довольно медленными. Есть ли способ, которым этот процесс может быть оптимизирован?
Какова ваша обеспеченная пропускная способность для записи и что потребляется, когда вы это делаете? Вы получаете дросселирование на любом из этих вызовов (может быть превышена пропускная способность одного раздела) (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.DataUpload)? Вы пишете все эти записи в одном потоке (может быть привязано IO)? Вы пытались увеличить размер пула соединений? – mkobit
Я настоятельно рекомендую запустить ваш код через профайлер (например: [JProfiler] (https://www.ej-technologies.com/download/jprofiler/files)), чтобы сузить проблему. Основываясь на предоставленной информации, это может быть что угодно - использование отдаленного региона (увеличение задержки), запись дросселирования, горячий хэш-ключ, проблемы с преобразованием ваших записей или что-то еще. Информация от профилировщика позволит вам узнать, где сосредоточить свое исследование. Кроме того, как выглядят ваши записи/таблица? Если у вас много записей с одним и тем же hashkey (или плохо определенным LSI/GSI), это может быть преступником. – Krease