объединение в пул соединений с cassandra-драйвер для nodejs

#node.js #sockets #cassandra

#node.js #сокеты #cassandra

Вопрос:

я написал небольшое приложение, чтобы понять концепцию объединения пулов соединений в cassandra. я тестирую его с помощью Apache bench tool. однако приложение иногда показывает ошибку и закрывает промежуточные соединения. и затем он выдает ошибку, как будто хост не работает. когда я даю запрос на 1 000 000 запросов с параллелизмом 1000. он выполняется успешно, но если я попытаюсь увеличить параллелизм, то это приведет к закрытию сокета и в конечном итоге покажет, что хост не работает. итак, каковы мои вопросы, есть ли ограничение на одновременные запросы, которые может обслуживать cassandra? предел составляет приблизительно 32 Тыс. запросов без ожидания ответа, поскольку я использую cassandra 3.0.

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

  2. в чем причина получения этих ошибок? для некоторых входов, но не для всех.

  3. как именно работает пул подключений в cassandra, поскольку мы можем установить только количество coreConnections на хост, а не количество запросов на соединение?

вот тестовый файл, который я создал.

 var cassandra = require("cassandra-driver");
  var express    = require("express");
  var distance = cassandra.types.distance;


  var cassClient = new cassandra.Client({contactPoints: ['myhost'],pooling: {
        coreConnectionsPerHost: {
          [distance.local] : 2,
          [distance.remote] : 1
        } 
     }, keyspace: 'MY_DB'});

  var app = express();
    cassClient.connect(function( err ){
      if( err ){
        console.log("Error: Connection to cassandra server." err);
      } else {
        console.log("Success !!!");
      }
    });

  var i =0;
  app.get("/",function(req,res){
  cassClient.execute('SELECT * from mytable LIMIT 2', function(err, rows) {
  //cassClient.shutdown();
    if (!err){   
    //  console.log('The solution is: '  i);
      return res.send();
      }
    else
      {

        i  ;
        console.log(err.message  "  " i);
        return res.send();
      }
    });
   // cassClient.nwd();
  });

  app.listen(3001);
  

ошибки, которые я получаю, являются

  • Все хосты, которые пытались выполнить запрос, завершились неудачей. Первая попытка хоста, myhost: 9042: хост считается ОТКЛЮЧЕННЫМ. Смотрите внутренние ошибки.
  • Все хосты, которые пытались выполнить запрос, завершились неудачей. Первый хост попытался, myhost: 9042: Ошибка: сокет был закрыт. Смотрите внутренние ошибки.
  • Все хосты, которые пытались выполнить запрос, завершились неудачей. Первая попытка хоста, myhost:9042: OperationTimedOutError: Хост myhost: 9042 не ответил до истечения времени ожидания 12000 мс. Смотрите внутренние ошибки.

итак, почему это происходит?

Ответ №1:

Следующая ошибка:

 All host(s) tried for query failed. First host tried, 
myhost:9042: OperationTimedOutError: The host myhost:9042 did not reply before 
timeout 12000 ms. See innerErrors.
  

Относится к таймаутам клиента: когда запрос выдается, но получение ответа от сервера занимает слишком много времени (см. socketOptions.readTimeout ).

Когда время ожидания слишком большого количества запросов одновременно истекает, соединение помечается как несуществующее (см. socketOptions.defunctReadTimeoutThreshold ) и удаляется из пула. Если пул пуст, узел помечается как ОТКЛЮЧЕННЫЙ.

Вы можете включить ведение журнала на уровне INFO или выше, чтобы увидеть, что происходит под капотом.

Комментарии:

1. я тоже читал то же самое. но меня беспокоит то, что даже если база данных небольшая и запрос не занимает больше времени, чем время ожидания чтения, он все равно показывает ошибки. это потому, что я запускаю несколько запросов одновременно?

2. Драйвер поддерживает высокие уровни параллелизма. Отображается ли в журнале драйверов что-то актуальное?