与nodejs

时间:2016-10-20 09:06:27

标签: node.js sockets cassandra

我写了一个小应用程序来理解cassandra中的概念连接池。我正在使用Apache工具测试它。然而,应用程序有时会显示错误并关闭其间的连接。然后它会抛出错误,就像主机关闭一样。当我给出1,00,000个并发1000的查询请求时,它成功执行但是如果我尝试增加并发性,那么它最终关闭套接字并最终显示主机已关闭。那么我的问题是cassandra可以服务的并发请求有限制吗? limit是近似的32K请求,无需等待响应,因为我正在使用cassandra 3.0。

  1. 这是否意味着我可以运行那么多的并发请求?

  2. 了解这个错误背后的原因是什么?一些输入而不是所有输入。

  3. 我们可以在cassandra中准确连接池的工作原理 仅设置每个主机的coreConnections数而不是数量 每个连接的请求数量?
  4. 这是我制作的测试文件。

    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:错误:套接字已关闭。见内心错误。
    • 所有尝试查询的主机都失败了。第一个主机尝试,myhost:9042:OperationTimedOutError:主机myhost:9042在超时12000毫秒之前没有回复。见内心错误。

    为什么会这样?

1 个答案:

答案 0 :(得分: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查看幕后发生的事情。