Cassandra连接最佳实践

问题描述:

我在Cassandra中使用Node JS,我不知道最佳的交互方式。我与卡桑德拉交互多个模块,我想知道这是否是最好Cassandra连接最佳实践

  1. 保持单个连接的
  2. 设置每个模块的连接,或者最好是将所有模块;
  3. 每当我有请求时连接到Cassandra。

此Web应用程序对大多数请求使用Cassandra。

我建议您使用DataStax Node.js driver for Cassandra,它具有连接池和透明故障转移功能,您只需执行查询,它就会为您处理剩下的问题。

var cassandra = require('cassandra-driver'); 
var client = new cassandra.Client({ 
    contactPoints: ['host1', 'host2'], 
    keyspace: 'ks1' 
}); 
var query = 'SELECT email, last_name FROM user_profiles WHERE key=?'; 
//the driver will handle connection pool and failover 
client.execute(query, ['guy'], function(err, result) { 
    assert.ifError(err); 
    console.log('User profile email ' + result.rows[0].email); 
}); 

免责声明:我是该项目的一个活跃的开发者

+1

我正在使用此驱动程序。你是否建议为每个模块保留一个连接或一个连接? – 2015-01-28 13:54:25

+1

客户端代表多个主机的连接池,您应该使用单个客户端实例并在所有模块中重用它:http://www.datastax.com/documentation/developer/nodejs-driver/1.0/nodejs-driver /faq/njdFaq.html – jorgebg 2015-01-29 10:31:05

我会连接并回收它们,而不是使用您列出的选项之一。这样你就不需要销毁已经建立的连接。唯一让我感到厌倦的是游泳池太大,所以确保你设定了一个合理的门槛。

事情是这样的:

no connections are available in pool 
    create connection (add it back once finished using it) 
connections are available in pool 
    fetch connection from pool 

原因选择一个池,而不是硬编码的数字:

  1. 保留所有模块的单一连接 - 这将是一个瓶颈,除非你正在运行一个单线程的应用程序,你不是
  2. 为每个模块设置连接 - 您需要提供更多的上下文。根据每个模块的线程数,这可能是一个很好的方法。
  3. 每次我有一个请求连接到卡桑德拉 - 建立连接并不便宜(下面的代码),所以不要丢弃它们!

Cluster cluster = Cluster.builder().addContactPoints("localhost").build(); 
long start = System.currentTimeMillis(); 
Session session = cluster.connect(); 
System.out.println(String.format("Took %s ms", System.currentTimeMillis() - start)); 

输出:490毫秒

+0

我使用node.js中不是一个单一的线程应用程序? – 2015-01-27 12:53:30