Cassandra с клиентом nodejs не работает должным образом

У меня настроены узлы, как показано ниже: DC1 (Node1, Node2) и DC2 (Node3 и Node4).

Я пытаюсь подключиться к Cassandra через клиент NodeJs, как показано ниже:

const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['172.30.56.60','172.30.56.61','172.30.56.62','172.30.56.63'], keyspace: 'users' });

console.log(client);

const query = 'INSERT INTO user (user_id, user_name, user_phone) VALUES (?, ?, ?) IF NOT EXISTS';

console.log(query);
console.time('time');
for (var primaryKey = 0; primaryKey < 10000; primaryKey++) {
    const params = [primaryKey, 'hari', 12345678];
    console.log(primaryKey);
    client.execute(query, params, { prepare: true, consistency: cassandra.types.consistencies.quorum });
    console.log(primaryKey);
}
console.timeEnd('time');

Я пытаюсь отследить общее время, затраченное на вставку всех 10000 записей, но я замечаю, что записи обновляются асинхронно (т.е.), я получаю время выполнения как «3,755 мс», но когда я проверяю в оболочке cqlsh это медленное обновление (используя select count(*) from user;), ПРИМЕЧАНИЕ. Я указал согласованность как «cassandra.types.consistencies.quorum»

Кассандра : 3.0

Какое изменение мне нужно, чтобы выполнить их синхронно?

Спасибо, Гарри


person Harry    schedule 20.11.2017    source источник


Ответы (1)


Прямо сейчас вы выполняете все свои запросы одновременно, так как не ждете завершения какого-либо запроса.

Метод client.execute возвращает обещание, поэтому для синхронного выполнения каждого запроса вы можете дождаться завершения каждого обещания, а затем выполнить следующий запрос. Вы можете сделать это с помощью async/await -

async function insertBulk() {
    for (var primaryKey = 0; primaryKey < 10000; primaryKey++) {
        const params = [primaryKey, 'hari', 12345678];
        await client.execute(query, params, { prepare: true, consistency: cassandra.types.consistencies.quorum });
    }
}

async function getTime() {
    console.time('time');
    await insertBulk(); // wait till all the queries are executed sequentially.
    console.timeEnd('time');
}

getTime();

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

person Jyotman Singh    schedule 20.11.2017