Cassandra 连接最佳实践

Cassandra connections best practice

我正在将 Node JS 与 Cassandra 一起使用,我想知道最好的交互方式是什么。我有多个与 Cassandra 交互的模块,我想知道

是否更好
  1. 为所有模块保持单一连接
  2. 为每个模块设置一个连接,或者最好是;
  3. 每次有请求时连接到 Cassandra。

此 Web 应用程序使用 Cassandra 处理大部分请求。

我会合并连接并回收它们,而不是使用您列出的选项之一。这样你就不需要破坏已经创建的连接。唯一让我感到厌倦的是游泳池太大,因此请确保设置一个合理的阈值。

像这样:

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. 每次我有请求时都连接到 Cassandra - 建立连接并不便宜(下面的代码),所以不要丢弃它们!

.

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 毫秒

我建议您使用 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);
});

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