使用node-cassandra-cql驱动程序的可怕性能,我做错了吗?

时间:2014-06-08 20:52:25

标签: node.js performance cassandra

我正在尝试使用node向Cassandra插入行。我以前在Cassandra的地方有Mongo,我可以合理地在一个节点mongo上获得1500次插入/秒。使用Cassandra和node-cassandra -cql,我得到大约175-250次插入/秒。这是一个巨大的性能下降。这是在没有索引的表上。

cql = require("node-cassandra-cql")
... 
 if (this.dbConnection == null) {
  this.dbConnection = new cql.Client({
    hosts: this.hosts,
    keyspace: this.keyspace
  });
 }
... 
var colAndValues, statement, v;  

colAndValues = "(" + (this.fieldsWithValue.join(',')) + ") values (" + (((function() {
    var _i, _len, _results;
    _results = [];
    for (_i = 0, _len = values.length; _i < _len; _i++) {
      v = values[_i];
      _results.push('?');
    }
    return _results;
  })()).join(', ')) + ")";

  statement = "INSERT INTO " + this.table + " " + colAndValues + ";";

  this.dbConnection.execute(statement, values, cql.types.consistencies.one, function(err) {
    if (err) {
      return emitter.emit('error', err + (" \nstatement: " + statement + "\nvalues: " + (JSON.stringify(values))));
    } else {
      return emitter.emit('complete', true);
    }
  });

好吧可能有点神秘,但语句和值看起来像:

statement: 
INSERT INTO data (order_id,order_ts,transaction_id,transaction_discount,transaction_qty,transaction_total,product_category,product_profit,product_upc,product_name,product_price,product_distributor,store_id,store_name,store_state,store_region,id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

values
[{"value":"70DQLVZLSN","hint":10},"2014-06-08T20:30:23.000Z",{"value":"1OOSC3PL9Q","hint":10},{"value":0,"hint":8},{"value":3,"hint":9},{"value":37.77,"hint":8},{"value":"Movies","hint":10},{"value":3.4,"hint":8},{"value":"PD1334R9688","hint":10},{"value":"The Hunt","hint":10},{"value":12.59,"hint":8},{"value":"IN5","hint":10},{"value":"6LMTY1OWR3","hint":10},{"value":"Sporket Spokane","hint":10},{"value":"WA","hint":10},{"value":"Northwest","hint":10},{"value":"819ddd7f-28e7-4247-90cf-03132ef8b66e","hint":12}]

这些只是插入虚拟数据库的测试值。它工作正常,但性能很糟糕。我认为添加提示会有所帮助;它没有。我也试过executeAsPrepared,没有变化。文档说没有必要在执行之前连接(驱动程序存储任何现有的连接)。

所以我没有想法我能做些什么来加速这件事。我想对它进行分析,但是在Ubuntu上运行V8 Profiler已经是一个时间问题(没有成功)。

2 个答案:

答案 0 :(得分:1)

来自node-cassandra-cql的github存储库的问题可以得到答案:

  1. 您是否正在重复使用相同的客户端实例(您应该使用1)?
  2. 您是否使用client.connect方法预热了游泳池?
  3. 您是否已启用登录驱动程序以查看正在进行的操作?
  4. 生成的查询是否始终相同(如果不是,则不应使用ready 语句)?

答案 1 :(得分:0)

伙计们,我们已经看到了类似的问题。从版本3.0.2开始,事情似乎更快。没有时间用负载测试来证明,但是驱动程序中的更改日志获得了一个性能图表,通过将驱动程序升级到3.1.0来清楚地显示4-5倍的性能提升