需要帮助riak-js

时间:2010-10-02 03:49:23

标签: javascript node.js riak

我是node.js和riak的新手,尝试使用riak-js。我写了以下coffeescript,用正整数1..N的正方形创建N个条目。该脚本适用于N = 10。如果我在console.log()中添加db.get()回调,我可以打印1..10的正方形。

db = require('riak-js').getClient({debug:false})

N = 10

for i in [1..N]
 db.save('Square', String(i), String(i*i))

for i in [1..N]
 db.get('Square', String(i))

我的问题是,当我把N = 1000时,我的脚本需要大约10秒才能完成。这是正常的吗?我期待在1秒内完成任务。我的本地机器上有一个riak节点,一台Acer Aspire 5740,i3 CPU和4GB内存,带有Ubuntu 10.04。对于仅限RAM的商店,我已将storage_backend中的$RIAK/rel/riak/etc/app.config设置为riak_kv_ets_backend。 riak-admin status命令确认此设置。

Q1:也许riak-js为我的存储桶设置了一些默认的基于磁盘的后端?我如何找出/覆盖它?

Q2:我不认为这是一个node.js问题,但是我在异步使用中做错了吗?

2 个答案:

答案 0 :(得分:2)

A1:riak-js不使用任何隐藏设置,由您来配置Riak节点。

A2:你的剧本看起来很好,没有什么是你做错的。

事实是我还没有开始基准测试或认真考虑性能问题。

也就是说,每个请求都在内部排队并按顺序发出。它使API更简单,你不会遇到竞争条件,但它有其局限性。理想情况下,我想构建一个围绕riak-js的包装器来处理:

  • 持有多个实例并行提出请求
  • 当一个节点出现故障时自动重新连接到群集中的其他节点

您的示例在我的MBP上运行约5秒(使用Bitcask)。

 =>  time coffee test.coffee 

real    0m5.181s
user    0m1.245s
sys 0m0.369s

作为概念证明,请看一下:

dbs = [require('riak-js').getClient({debug: false}), require('riak-js').getClient({debug: false})]

N = 1000

for i in [1..N]
  db = dbs[i % 2]
  db.save('sq', String(i), String(i*i))

for i in [1..N]
  db = dbs[i % 2]
  db.get('sq', String(i))

结果:

 =>  time coffee test.coffee 

real    0m3.341s
user    0m1.133s
sys 0m0.319s

通过使用更多客户端访问数据库,这将得到改善。

否则答案是Protocol Buffers接口,毫无疑问。我无法用你的例子运行它所以我将不得不深入研究它。但那应该是闪电般快速的。

确保您正在运行最新的Riak(已经有很多性能改进)。还要考虑CoffeeScript编译的一些开销。

答案 1 :(得分:0)

这是我的测试文件:

db = require('../lib').getClient({debug:false})

N = if process.argv[2] then process.argv[2] else 10

for i in [1..N]
 db.save('Square', String(i), String(i*i))

for i in [1..N]
 db.get('Square', String(i))

编译后,我得到以下时间:

$ time node test1.js 1000

real 0m3.759s
user 0m0.823s
sys  0m0.421s

经过多次迭代后,无论后端如何,我在该卷上的时间都相似。我测试了ets和dets。操作系统将在特定卷的第一次运行时缓存磁盘块,但后续运行速度更快。

继续frank06的回答,我也会研究连接处理。这对Riak来说不是问题,因为这是riak-js如何建立连接的问题。另请注意,在Riak中,所有节点都是相同的,因此如果您有一个三节点集群,您将创建与所有三个节点的连接,并以某种方式循环它们。 Protobuf api是可行的方式,但在设置时需要额外注意。