Cassandra连接最佳实践
问题描述:
我在Cassandra中使用Node JS,我不知道最佳的交互方式。我与卡桑德拉交互多个模块,我想知道这是否是最好Cassandra连接最佳实践
- 保持单个连接的
- 设置每个模块的连接,或者最好是将所有模块;
- 每当我有请求时连接到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);
});
免责声明:我是该项目的一个活跃的开发者
答
我会连接并回收它们,而不是使用您列出的选项之一。这样你就不需要销毁已经建立的连接。唯一让我感到厌倦的是游泳池太大,所以确保你设定了一个合理的门槛。
事情是这样的:
no connections are available in pool
create connection (add it back once finished using it)
connections are available in pool
fetch connection from pool
原因选择一个池,而不是硬编码的数字:
- 保留所有模块的单一连接 - 这将是一个瓶颈,除非你正在运行一个单线程的应用程序,你不是
- 为每个模块设置连接 - 您需要提供更多的上下文。根据每个模块的线程数,这可能是一个很好的方法。
- 每次我有一个请求连接到卡桑德拉 - 建立连接并不便宜(下面的代码),所以不要丢弃它们!
。
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
我正在使用此驱动程序。你是否建议为每个模块保留一个连接或一个连接? – 2015-01-28 13:54:25
客户端代表多个主机的连接池,您应该使用单个客户端实例并在所有模块中重用它:http://www.datastax.com/documentation/developer/nodejs-driver/1.0/nodejs-driver /faq/njdFaq.html – jorgebg 2015-01-29 10:31:05