0

我已经使用 php 和 cassandra 和 phpcassa 构建了一个事件 api。

最近,我编写了一个 node.js + helenus 替换相同的 api。完成后,我开始使用 ab 工具对 node.js 代码进行基准测试。但是,在 cassandra 上插入 1000 多次后,连接可能会丢失并且故障转移代码正在运行。在每个请求发生后,我将异步插入到 cassandra。

ConnectionPool当节点应用程序启动时,我正在实例化对象。但是,我pool.connect()在每个请求中都使用函数。

是否pool.connect()启动新连接或绑定来自ConnectionPoolobject 的现有连接?

笔记:

在 phpcassa 中,我没有遇到这样的问题可能是因为我正在插入 cassandra 同步。

我正在使用 5 个 cassandra 节点

4

1 回答 1

2

是的,pool.connect()每次调用它都会创建一个与池的新连接,因此您通常只需在应用程序启动时调用它一次,并将该连接传递给需要它的任何模块或方法。

我通常使用一个模块来做到这一点

module.exports = function(app, cb) {

    var domain  = require('domain'),
        d       = domain.create(),
        helenus = require('helenus'),

    d.run(function() {
        var pool = new helenus.ConnectionPool({
            hosts      : ['localhost:9160'],
            user       : "",
            password   : "",
            keyspace   : 'something',
            cqlVersion : '3.0.0'
        });

        pool.connect(function(err, keyspace){
            if(err){
                cb(err, null);
            } else {
                cb(null, pool);
            }
        });

        pool.on('error', function(err) {
            cb(err, null);
        });
    });

    d.on('error', function(err) {
        console.log('error', err.stack);
        cb(err, null);
    });
}

并用类似这样的方式将其称为我的应用程序(非常简化)

var express  = require('express');
var app      = this.express();
var database = require('db');

database(app, function(err, conn) {
    if (err==null) {
        // connected, do stuff
        conn.cql("SELECT * FROM table WHERE KEY = ?", [what], function(err, result) {
            if (err==null) {
                // get result
            }
        });
    }
});

我已经将它用于数百万条记录、连续插入和大量查找,没有任何问题,Cassandra 对我来说比我尝试过的任何其他数据库都好。

于 2013-12-14T19:26:38.590 回答