saveAll () слишком медленный. База данных Cassandra с загрузкой Spring. Почему? - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь вставить в пакеты (Объекты хранятся в массиве, и как только счетчик делится на 10000, я вставляю все эти объекты в свою таблицу. Но для этого требуется более 4 минут. какой подход быстрее?

arr.add(new Car(name, count, type));
if(count%10000==0){
repository.saveAll(arr);
arr.clear();
}

1 Ответ

2 голосов
/ 07 марта 2020

Итак, вот что происходит. Мне очень любопытно увидеть определение таблицы внутри Кассандры. Но учитывая ваш Car конструктор,

new Car(name, count, type)

Учитывая эти имена столбцов, я предполагаю, что name является ключом раздела.

Причина, которая является важной, заключается в том, что га sh столбца ключа раздела - это то, что Cassandra использует, чтобы выяснить, в какой узел (диапазон токенов) должны быть записаны данные.

Когда вы saveAll на 10000 Cars сразу, нет никак вы можете гарантировать, что все 10000 из них идут на один и тот же узел. Чтобы справиться с этим, Spring Data Cassandra должна использовать BATCH (или что-то подобное) за кулисами. Если это BATCH, то это, по сути, ставит один узел Кассандры (обозначенный как «координатор») для маршрутизации записи на требуемые узлы. Из-за распределенной природы Кассандры, , которая никогда не будет быстрой.

Если вам действительно нужно хранить 10000 из них, лучшим способом будет отправить одну запись за раз асинхронно . Конечно, вам не нужно, чтобы все 10000 потоков писали одновременно, поэтому вам нужно уменьшить (ограничить) количество активных потоков в вашем коде. Райан Свихла из DataStax написал пару статей, подробно описывающих, как это сделать. Я рекомендую этот - Cassandra: пакетная загрузка без пакета - Nuanced Edition .

tl; dr;

Spring Data Кассандры saveAll на самом деле не следует использовать для сохранения нескольких тысяч записей. Если бы я использовал Spring Data Cassandra, я бы не стал даже go за двузначными числами с saveAll, TBH.

Редактировать

Проверить этот ответ подробности о том, как использовать Spring Boot / Data с Cassandra асинхронно: Примеры AsyncCassandraOperations

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...