【问题标题】:connection pooling with cassandra-driver for nodejs用于 nodejs 的 cassandra-driver 连接池
【发布时间】:2016-10-20 22:57:02
【问题描述】:

我编写了一个小应用程序来理解 cassandra 中的连接池概念。我正在使用 Apache bench 工具对其进行测试。但是,该应用程序有时会显示错误并关闭其间的连接。然后它会抛出错误,例如主机已关闭。当我请求 1,00,000 个并发 1000 的查询时。它成功执行,但是如果我尝试增加并发性,那么它最终会关闭套接字并最终显示主机已关闭。那么我的问题是 cassandra 可以服务的并发请求是否有限制? limit 是大约 32K 请求,无需等待响应,因为我使用的是 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: 主机被认为是 DOWN。请参阅内部错误。
  • 尝试查询的所有主机均失败。第一个主机尝试,myhost:9042: Error: Socket was closed。请参阅内部错误。
  • 尝试查询的所有主机均失败。第一个主机尝试,myhost:9042: OperationTimedOutError: 主机 myhost:9042 在超时 12000 毫秒之前没有回复。请参阅内部错误。

那么为什么会这样呢?

【问题讨论】:

    标签: node.js sockets cassandra


    【解决方案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)并从池中删除。如果池为空,则节点标记为 DOWN。

    您可以在 INFO 或更高级别 enable logging 了解幕后发生的事情。

    【讨论】:

    • 我也读过同样的东西。但我担心的是,即使数据库很小并且查询花费的时间不超过读取超时,它仍然会显示错误。是因为我同时触发了多个请求吗?
    • 驱动支持高并发。驱动程序日志是否显示相关内容?
    猜你喜欢
    • 2015-11-13
    • 2018-12-16
    • 2013-10-22
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2022-01-06
    • 2018-06-27
    相关资源
    最近更新 更多