запрос cassandra медленный на nodejs, но не в терминале
Я создал тестовую учетную запись в datastax (https://astra.datastax.com/) и хочу протестировать кассандру.
На главной странице находится консоль cqlsh. Если я выберу данные, это будет очень быстро, может быть, 1 мс.
Если я использую его с драйвером nodejs и cassandra, это займет 2-3 секунды. А у меня всего ОДНА строка.
Почему нужно время? Это ошибка моего кода?
const { Client } = require("cassandra-driver");
async function run() {
const client = new Client({
cloud: {
secureConnectBundle: "secure-connect-weinf.zip",
},
keyspace: 'wf_db',
credentials: {
username: "admin",
password: "password",
},
});
await client.connect();
// Execute a query
const rs = await client.execute("SELECT * FROM employ_by_id;");
console.log(`${rs}`);
await client.shutdown();
}
// Run the async function
run();
1 ответ
К сожалению, это не сравнение яблок вместо яблок.
Каждый раз, когда ваше приложение подключается к кластеру Cassandra (Astra или иначе), драйвер выполняет следующие высокоуровневые шаги:
- Распакуйте безопасный пакет, чтобы получить информацию о кластере
- Откройте TCP-соединение через Интернет
- Создайте управляющее соединение с одним из узлов кластера.
- Получить схему из кластера с помощью управляющего соединения
- Откройте для себя топологию кластера с помощью управляющего соединения.
- Открытые подключения к узлам в кластере
- План запроса вычислений (список хостов для подключения на основе политики балансировки нагрузки)
- И наконец, запустим запрос
В отличие от этого, когда вы получаете доступ к консоли CQL на панели управления Astra, пользовательский интерфейс автоматически подключается + аутентифицируется к кластеру, и когда вы вводите оператор CQL, он выполняет следующие шаги:
- Пропущено (вы уже аутентифицированы в кластере)
- Пропущено (он уже подключен к узлу в том же локальном VPC)
- Пропущено (уже подключено к кластеру)
- Пропущено (уже подключено к кластеру)
- Пропущено (уже подключено к кластеру)
- Пропущено (уже подключено к кластеру)
- Пропущено (уже подключено к кластеру)
- И наконец, запустим запрос
Как видите, у консоли CQL нет таких накладных расходов, как у многократного запуска приложения, в котором есть только 1 оператор CQL.
На самом деле ваше приложение будет повторно использовать один и тот же сеанс кластера для выполнения запросов на протяжении всего жизненного цикла приложения, поэтому у него не будет таких же накладных расходов, как при простом повторном запуске приложения, которое вы указали выше. Фаза инициализации (шаги с 1 по 6 выше) выполняется только при запуске приложения. Когда он уже запущен, ему нужно выполнить только шаги 7 и 8. Ура!