2010-10-02 57 views
1

我是一个有node.js和riak的新手,试图使用riak-js。我写了如下coffeescript,用整数1..N的平方来创建N个条目。该脚本适用于N = 10。如果我在db.get()中插入console.log()回调,我可以打印1..10的正方形。需要帮助riak-js

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节点,一台配备Ubuntu 10.04的Acer Aspire 5740,i3 CPU和4GB内存。对于只有RAM的商店,我已将storage_backend设置为$RIAK/rel/riak/etc/app.configriak_kv_ets_backend。 riak-admin status命令确认此设置。

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

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

+0

您应该尝试使用'async'库同时执行Riak查询。 – ekillaby 2013-06-26 20:33:29

回答

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 

这将提高通过使用更多的客户击中DB。

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

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

+0

谢谢frank06。例如,我注意到scalaris通过“请求列表”支持并行请求。我通过创建一个长字符串来尝试使用riak-js的弱版本:我把s = s + String(i)+“,”+ String(i * i)+“;”在一个for循环中,然后做了一次保存/进入riak进程。这一嘎吱嘎吱通过N = 100000在闪光。 – user402476 2010-10-04 16:34:37

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。 os会在第一次运行时缓存磁盘块,但后续运行速度会更快。

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

+0

谢谢siculars。我知道一些erlang(我是一个敏锐的学生,直到我偶然发现节点),所以我会看看erlang客户端PBC。 – user402476 2010-10-04 16:41:40