запрос 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 или иначе), драйвер выполняет следующие высокоуровневые шаги:

  1. Распакуйте безопасный пакет, чтобы получить информацию о кластере
  2. Откройте TCP-соединение через Интернет
  3. Создайте управляющее соединение с одним из узлов кластера.
  4. Получить схему из кластера с помощью управляющего соединения
  5. Откройте для себя топологию кластера с помощью управляющего соединения.
  6. Открытые подключения к узлам в кластере
  7. План запроса вычислений (список хостов для подключения на основе политики балансировки нагрузки)
  8. И наконец, запустим запрос

В отличие от этого, когда вы получаете доступ к консоли CQL на панели управления Astra, пользовательский интерфейс автоматически подключается + аутентифицируется к кластеру, и когда вы вводите оператор CQL, он выполняет следующие шаги:

  1. Пропущено (вы уже аутентифицированы в кластере)
  2. Пропущено (он уже подключен к узлу в том же локальном VPC)
  3. Пропущено (уже подключено к кластеру)
  4. Пропущено (уже подключено к кластеру)
  5. Пропущено (уже подключено к кластеру)
  6. Пропущено (уже подключено к кластеру)
  7. Пропущено (уже подключено к кластеру)
  8. И наконец, запустим запрос

Как видите, у консоли CQL нет таких накладных расходов, как у многократного запуска приложения, в котором есть только 1 оператор CQL.

На самом деле ваше приложение будет повторно использовать один и тот же сеанс кластера для выполнения запросов на протяжении всего жизненного цикла приложения, поэтому у него не будет таких же накладных расходов, как при простом повторном запуске приложения, которое вы указали выше. Фаза инициализации (шаги с 1 по 6 выше) выполняется только при запуске приложения. Когда он уже запущен, ему нужно выполнить только шаги 7 и 8. Ура!

Другие вопросы по тегам